gpt4 book ai didi

ruby - instance_eval 中的 define_method

转载 作者:数据小太阳 更新时间:2023-10-29 08:45:06 24 4
gpt4 key购买 nike

当我在 instance_eval block 中为类定义一个方法时,它会创建一个很好的类方法。

例如)

class A
end

A.instance_eval do
def method; end
end

A.method #works

但是当我在 instance_eval 中使用 define_method 时,它会创建实例方法而不是类方法例如)

A.instance_eval do
define_method(:method1) {}
end
A.method1 # NoMethodError: undefined method `method1'
A.new.method1 # Works fine

我无法理解以上现象。请有人帮帮我。

最佳答案

如果您在实例(这是它的主要目的)的上下文中查看instance_eval,这种古怪的行为会更有意义。

class A
end

a = A.new
a.instance_eval do
def foo
end
end

foo 在哪里定义的?我能想到的唯一明智的地方是a的单例类,确实如此

a.method(:foo).owner == a.singleton_class
# true

所以这证明了规则

def inside instance_eval defines a method in self's singleton class.

这与你看到的完全一致。

A.instance_eval do
# defines method in A's singleton class!
def method; end
end

那么为什么 define_method 表现不同呢?因为与 def 不同,它是一个方法!所以这个

A.instance_eval do
define_method(:foo) {}
end

真的只是

A.define_method(:foo) {}

这是创建普通实例方法的元编程方式。这种不一致可能看起来很烦人,但再看看正常实例的情况,您就会明白为什么 defdefine_method 不能 保持一致.这个

a.instance_eval do
define_method(:foo) {}
end

真的只是

a.define_method(:foo) {}

这是废话

NoMethodError: undefined method `define_method' for #<A:0x00008>

关于ruby - instance_eval 中的 define_method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31013570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com