鉴于在Ruby中共享方法的各种方法,以及这些方法本身就是对象的事实,这种共享的基本机制是什么?例如,给定:
module A
def alpha; end
end
module B
include A
end
准确地说B&#39 {1}}实例方法是A&#39>的副本是否准确?看起来如此:
alpha
这使得它看起来(对我来说)像alpha_b是属于B的alpha_a的副本。但是阅读Ruby对方法查找/调度的处理,听起来这个调用遍历祖先一直回来在找到要调用的方法之前到A.另外,还有:
alpha_a = A.instance_method(:alpha)
alpha_b = B.instance_method(:alpha)
alpha_a == alpha_b
=> false
alpha_a.object_id == alpha_b.object_id
=> false
那到底是怎么回事? alpha_a和alpha_b都是"驻留"在A中,尽管后者在B包括A时生成了?底层机制是否依赖于共享模式(包括/扩展/继承)?
答案 0 :(得分:3)
alpha_a
是一个描述alpha
上方法A
的对象。这不是方法本身。方法本身就像一个块一样,不是一个对象,就像块不是对象一样,但可以包装在Proc
个对象中。同样,alpha_b
描述了alpha
上的方法B
。
方法本身是相同的:它在模块A
上定义。没有复制。