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; endイディオム、Ruby 1.8ではイディオムを介してアクセスできます。

于 2012-02-23T22:49:18.813 に答える