我不明白为什么会这样.
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
Run Code Online (Sandbox Code Playgroud)
基本上我有一个"基础"模块,它设置了一些东西.我还有一个插件模块,如果某个类想要包含它,它会设置更多的东西.
现在,当我测试它时,如果我没有那个超级电话,我会得到
nil
2
Run Code Online (Sandbox Code Playgroud)
当我有超级电话时,我明白了
1
2
Run Code Online (Sandbox Code Playgroud)
超级实际上在这做什么?即使Base和Addon不相关,它也会从Base模块调用setup方法.
这是我第一次在模块环境中使用super.以前我总是使用类的超级调用,并认为它只是继承树继续寻找具有相同方法的父级.
是否包含多个模块还设置了某种继承树?
编辑:对于上下文,如果没有Base模块,将永远不会包含Addon模块,并且在任何其他Addon模块之前将始终包含Base模块.
Ser*_*sev 32
是的,当您包含模块时,它们会被注入到继承链中
Test.ancestors # => [Test, Addon, Base, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)
Addon模块,包括在内,重新定义现有setup方法Base.如果您想要Base调用版本,请使用super.