2012-07-09 51 views
18

我不明白为什么这个工作。Ruby:模块和超级?

module Base 
    attr_reader :first 
    def setup 
    @first = 1 
    end 
end 

module Addon 
    attr_reader :second 
    def setup 
    #super 
    @second = 2 
    end 
end 

class Test 
    include Base 
    include Addon 

    def initialize(num) 
    @num = num 
    setup 
    end 
end 

a = Test.new(1) 
p a.first 
p a.second 

基本上我有一个“基地”模块,它设置了一些东西。我还有一个插件模块,如果某个类想要包含它,它将设置更多内容。

现在,当我测试了一下,如果我没有那个超打电话给我们,我得到

nil 
2 

当我有超级电话,我得到

1 
2 

什么超级实际上做在这里做?它调用基本模块的设置方法,即使Base和Addon不相关。

这是我第一次在模块上下文中使用super。以前,我一直使用类的超级调用,并认为它只是继承树上找到一个父方法相同。

是否包含多个模块还设置某种继承树?

编辑:用于上下文中,附加模块将永远不会被包括而不基本模块,并且基座模块将总是被包括任何额外的附加模块之前。

+0

我认为你是对的。方法签名可能存储在堆栈中,超级只是将消息分派到堆栈中更深处的对象。有趣的发现我会说! – Candide 2012-07-09 22:05:56

回答

23

是,当你包括的模块,它们被注入到继承链

Test.ancestors # => [Test, Addon, Base, Object, Kernel, BasicObject] 

Addon模块,当包括时,重新定义从Base现有setup方法。如果您想要Base的版本,请使用super