2013-05-06 33 views
0

这里访问的一些代码演示行为我说的是:当我包括另一个已经被列入一类的模块,新的方法不是对类

module A 
    def foo; end 
end 

# initialize B with no methods 
module B; end 

class C 
    include B 
end 

# add methods to B 
module B 
    def foo; end 
    include A 
end 

C.new.foo 
C.new.bar # error: instance method bar is not defined for C 

所以def添加到B的内容被反映在C中,而添加的include不是(除非B被重新包括在内)。为什么是这样,并且有一个干净的方法呢?

+6

'bar'应该来自哪里?我在'A'和'B'中看到'foo',但在任何地方都看不到'bar'。 – 2013-05-06 04:50:36

回答

1

当你include在类C模块M,这是发生了什么:

  1. 红宝石创建一个类(姑且称之为⟦M′⟧),其方法表指针,常数表指针和类变量表指针指向到M的方法表,常量表和类变量表。
  2. ⟦M′⟧的超类指针设置为C的超类。
  3. C的超类指针设置为⟦M′⟧

如果模块include编在M中,则该过程被递归应用。

请注意,当您调用include时,mixin的递归展平应用一次。将会反映继承层次结构中发生的任何更改而不是

然而,当你添加一个方法来M的方法表,这种变化会反映,因为只有一个方法表,哪个都M⟦M′⟧参考。

相关问题