0

私はコードを見ました:

class MyClass
  define_method :my_method do |my_arg|
    my_arg*3
  end
end 

obj = MyClass.new
obj.my_method(2)  # => 6

を作成するときobj、まだ呼び出していないdefine_methodので、my_method作成されるべきではありませんでした。では、なぜobj.my_method(2)直接電話できるのでしょうか。つまり、インスタンス化define_methodされたときに実行されますか?MyClass

4

2 に答える 2

1

すべてのメソッドは、読み取られたコンテキストに直接表示されたときに実行されます。define_methodメソッドを定義するmethodにも例外はありません。メソッドdefine_methodは2行目で呼び出されます(したがって、メソッドmy_methodが定義されます)。これは、7行目で作成される前objです。定義されたメソッドはオブジェクトではありません。

于 2013-03-25T03:25:47.973 に答える
0

クラスを定義するコードが解釈されるときに、メソッドが定義されます。

[6] pry(main)> class Foo
[6] pry(main)*   puts 'in Foo'
[6] pry(main)*   define_method :foo do |arg|
[6] pry(main)*     puts arg
[6] pry(main)*   end
[6] pry(main)* end
in Foo
=> #<Proc:0x007fcc1b176558@(pry):12 (lambda)>
[7] pry(main)> Foo.instance_methods(false)
=> [:foo]
于 2013-03-25T03:16:23.417 に答える