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

当任何方法直接出现在被读取的上下文中时,它都会被执行。method 也不例外define_method,它定义了一个方法。该方法在第 2 行define_method被调用(因此该方法my_method被定义),obj在第 7 行创建之前。定义的方法不是对象。

于 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 回答