1

这是一个例子:

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() 中定义的方法存储在哪里?

4

1 回答 1

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您也可以直接在对象上定义方法,而不是使用。obj.singleton_class在这两种情况下,它们都以对象的单例类(eigenclass)结束,在 Ruby 1.9中可以通过class << self ; self; endRuby 1.8 中的惯用语来访问。

于 2012-02-23T22:49:18.813 回答