如何理解动态方法创建

时间:2013-03-25 03:07:13

标签: ruby

我看到了代码:

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执行了吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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]