instance_eval()中定义的Ruby存储方法在哪里

时间:2012-02-23 22:41:41

标签: ruby instance-eval

以下是一个例子:

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()中定义的方法?

1 个答案:

答案 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成语来访问。