我正在阅读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!
Run Code Online (Sandbox Code Playgroud)
和:
def define_methods
shared = 0
Kernel.send :define_method, :counter do
shared
end
Kernel.send :define_method, :inc do |x|
shared += x
end
end
define_methods
counter # => 0
inc(4)
counter # => 4
Run Code Online (Sandbox Code Playgroud)
我想知道为什么在第一个示例中定义方法时,而不必在第二个示例中使用动态分派(使用Kernel.send)。
我给了一些想法,但听不懂。
谢谢!
Module#define_method是私人的。私有方法只能在没有接收者的情况下调用。因此,在第二个示例中,您需要使用反射(即send)来规避访问限制。
请注意,第一个示例仍然使用动态调度。实际上,在Ruby中,所有内容(变量访问和某些内置运算符除外)都使用动态分配。
| 归档时间: |
|
| 查看次数: |
840 次 |
| 最近记录: |