我不明白为什么会这样。
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不相关,它也会从Base模块调用setup方法。
这是我第一次在模块环境中使用super。以前我总是使用类调用超级调用,并认为它只是继承树继续查找具有相同方法的父类。
是否包含多个模块还设置了某种继承树?
编辑:对于上下文,如果没有Base模块,将永远不会包含Addon模块,并且在任何其他Addon模块之前将始终包含Base模块。
答案 0 :(得分:29)
是的,当您包含模块时,它们会被注入到继承链
中Test.ancestors # => [Test, Addon, Base, Object, Kernel, BasicObject]
Addon
模块(包含在内)从setup
重新定义现有的Base
方法。如果您希望调用Base
的版本,请使用super
。