Ruby定义方法问题
我正在读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!
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