如果您在实例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
所以这证明了规则
definside在的单例类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>