是继承/混合方法的原始副本吗?

时间:2015-11-25 05:41:35

标签: ruby methods

鉴于在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时生成了?底层机制是否依赖于共享模式(包括/扩展/继承)?

1 个答案:

答案 0 :(得分:3)

alpha_a是一个描述alpha上方法A的对象。这不是方法本身。方法本身就像一个块一样,不是一个对象,就像块不是对象一样,但可以包装在Proc个对象中。同样,alpha_b描述了alpha上的方法B

方法本身是相同的:它在模块A上定义。没有复制。