以下是一个例子:
class MyClass
end
obj = MyClass.new
obj.instance_eval do
def hello
"hello"
end
end
obj.hello
# => "hello"
obj.methods.grep "hello"
# => ["hello"]
MyClass.instance_methods.grep "hello"
# => []
MyClass的实例方法不包含'hello'方法,所以我的问题是Ruby存储instance_eval()中定义的方法?
答案 0 :(得分:2)
看看这个:
obj = MyClass.new
def obj.hello
"hello"
end
obj.hello #=> "hello"
obj.singleton_methods #=> [:hello]
obj.methods.grep :hello #=> [:hello]
obj.instance_eval do
def hello2 ; end
end #
obj.singleton_methods #=> [:hello, :hello2]
正如您所看到的,您可以直接在对象上定义方法,而不是使用instance_eval
。在这两种情况下,它们最终都出现在对象的单例类(eigenclass)中,可以通过Ruby 1.9中的obj.singleton_class
和Ruby 1.8中的class << self ; self; end
成语来访问。