以下是一些代码,展示了我正在谈论的行为:
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
因此添加到B的def
反映在C中,而添加的include
s则不反映(除非之后重新包含B)。为什么会这样,并且有一个干净的方式吗?
答案 0 :(得分:1)
当您在include
课程中M
模块C
时,会发生以下情况:
⟦M′⟧
),其方法表指针,常量表指针和类变量表指针指向M
的方法表,常量表和类变量表。 / LI>
⟦M′⟧
的超类指针设置为C
的超类。C
的超类指针设置为⟦M′⟧
。如果include
中有M
个模块,则会以递归方式应用此过程。
请注意,当您调用include
时,mixin的递归展平会在一次时应用。 不之后对继承层次结构所做的任何更改都将被反映出来。
但是,当您向M
的方法表添加方法时,将反映该更改,因为只有一个方法表,M
和⟦M′⟧
参考。