在以下示例中,模块M
包含在类A
中,然后重新打开以添加子模块MM
和方法。然后,它包含在课程B
中:
module M
def foo; "foo" end
end
class A
include M
end
module MM
def baz; "baz" end
end
module M
include MM
def bar; "bar" end
end
class B
include M
end
A
和B
的实例都可以访问M
的方法,无论它们何时添加,但只有B
具有子模块的方法{{1} }:
MM
我认为这是不一致的行为,并想了解为什么会发生这种情况。
答案 0 :(得分:2)
当您include
模块M
进入具有超类C
的班级S
时,会发生以下情况:
M'
,其方法表指针,常量表指针,实例变量表指针和类变量表指针指向M
方法表,常量表,实例变量表和类变量表。M'
的超类指针设置为C
的超类(即S
)C
的超类指针设置为M'
对于混合到M
中的任何模块(以及混合到模块中的模块混合到M
等等),递归重复此过程。
这样,当你调用include
时,mixin层次结构的线性化只需要发生一次。另一种选择(这似乎是你期望发生的事情)是为每个方法调用执行这个相当昂贵的过程。