def define_methods
shared = 1
Kernel.send :define_method, :counter do
puts shared
end
Kernel.send :define_method, :inc do |x, y|
shared = shared + x + y
end
end
define_methods
counter
inc(3, 4)
counter
这里是 send 的动态派发的特性,我查了 send 是 Object#send,即是 Object 的实例方法,而这为什么可以像类方法一样调用呢?
假设问题 1 已经解决,是什么保证了 定义的方法在顶级作用域中?我个人认为和 Kernel 有关,所以请 ruby 高手指点下
@zgm 我知道 ruby 类也是对象,我的疑问在这里:
send 是实例方法,理应是 实例对象.send , 可 Kernel 明显不是实例对象,虽然 Module 也是对象,请细说下这里
@Daniel_Xu 为什么你认为 Kernel 不是实例对象呢?Kernel 是 Module 类的一个实例对象啊!
puts Kernel.class.inspect
#4 楼 @neverlandxy_naix 好了,我明白了
总结下:Module # define_method(), 而 Kernel 是 Module 的实例对象,所以 Kernel.send :define_method 可以理解了
Q2 main 是 Object 的一个实例对象,而 Oject 的上一层是 Kernel, 所以 Kernel.send :define_method 必然在顶级作用域
Kernel.send :define_method ...
你是向 Kernel 发送的消息,当然就定义在了顶级作用域
Object.ancestors
=> [Object, Kernel, BasicObject]