如果您在实例instance_eval
的上下文中查看,这种古怪的行为会更有意义(这是它的主要目的)。
class A
end
a = A.new
a.instance_eval do
def foo
end
end
在哪里foo
定义?我能想到的唯一明智的地方是a
'ssingleton 类,确实如此
a.method(:foo).owner == a.singleton_class
# true
所以这证明了规则
def
inside在的单例类instance_eval
中定义了一个方法。self
这与您所看到的完全一致。
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) {}
这是创建普通实例方法的元编程方式。这种不一致可能看起来很烦人,但再看看正常情况下的情况,你就会明白为什么def
并且define_method
不能保持一致。这
a.instance_eval do
define_method(:foo) {}
end
真的只是
a.define_method(:foo) {}
这是胡说八道
NoMethodError: undefined method `define_method' for #<A:0x00008>