Ruby定义方法问题

Ruby定义方法问题,ruby,Ruby,我正在读Ruby的元编程 以下是本书中的两段代码片段: my_var = "Success" MyClass = Class.new do puts "#{my_var} in the class definition!" define_method :my_method do puts "#{my_var} in the method!" end end MyClass.new.my_method ⇒ Success in the class definition!

我正在读Ruby的元编程

以下是本书中的两段代码片段:

my_var = "Success"

MyClass = Class.new do 
  puts "#{my_var} in the class definition!"
  define_method :my_method do
    puts "#{my_var} in the method!"
  end
end

MyClass.new.my_method

⇒ Success in the class definition!
  Success in the method!
以及:

我想知道为什么在第一个示例中定义方法时不必使用动态分派(使用Kernel.send),而在第二个示例中必须使用它

我给了它一些想法,但不能理解它


谢谢

模块#定义_方法
是私有的。只能在没有接收者的情况下调用私有方法。因此,在第二个示例中,您需要使用反射(即
send
)来规避访问限制


注意,第一个示例仍然使用动态分派。事实上,在Ruby中,所有东西(除了变量访问和一些内置操作符)都使用动态分派。

与书中所说的相反,它在没有
内核的情况下工作。发送
,您只需要
self
的类包含
内核的上下文,这几乎总是如此

例如,如果您在主作用域中执行此操作,则它位于:

irb(main):024:0> self.class.ancestors
=> [Object, Kernel, BasicObject]
所以,使用

  define_method :counter do
    shared
  end
很好


只有在当前上下文中未包含
内核
时,您才需要该技巧,例如,如果您位于普通的
BasicObject
,或某个用户创建的子类中。

“只能在没有接收器的情况下调用私有方法。”-因此。。简单地忽略接收者,那么它将是一个隐式接收者,并且工作正常。看看我的答案。我误解了什么吗?@KarolyHorvath:隐式接收者是
self
,但作者希望接收者是
Kernel
  define_method :counter do
    shared
  end