在下面的示例中,模块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
endA和B的实例都可以访问M的方法,不管它们是什么时候添加的,但是只有B有子模块MM的方法。
a = A.new
a.foo
a.bar
a.baz # => Error: not defined
b = B.new
b.foo
b.bar
b.baz我认为这是不一致的行为,我想了解为什么会发生这种情况。
发布于 2014-03-14 15:18:32
当您将模块include M与超类S合并为类C时,会发生以下情况:
M',其方法表指针、常表指针、实例变量表指针和类变量表指针指向M的方法表、常数表、实例变量表和类变量表。M'的超类指针被设置为C的超类(即S)。C的超类指针被设置为M'。对于任何混入M的模块(以及混合到M中的模块等等),这个过程都是递归的。
这样,当调用include时,混和层次结构的线性化只需要发生一次。另一种选择(这似乎就是您所期望的那样)将是为每个方法调用执行这个非常昂贵的过程。
https://stackoverflow.com/questions/22405602
复制相似问题