我不明白为什么这样行得通。
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基本上我有一个"base“模块,用来设置一些东西。我还有一个addon模块,如果某个类想要包含它,它会设置更多的东西。
现在,当我测试它时,如果我没有那个超级呼叫,我会得到
nil
2当我接到超级电话时,我会得到
1
2super在这里到底做了什么?它从Base模块调用setup方法,即使Base和Addon不相关。
这是我第一次在模块的上下文中使用super。以前,我总是对类使用超级调用,并认为这只是在继承树上向上查找具有相同方法的父级。
包含多个模块是否也建立了某种继承树?
编辑:对于上下文,如果没有基本模块,附加模块将永远不会被包括在内,并且基本模块将始终包含在任何附加附加模块之前。
发布于 2012-07-10 06:33:26
是的,当您包含模块时,它们被注入到继承链中
Test.ancestors # => [Test, Addon, Base, Object, Kernel, BasicObject]当包含Addon模块时,它会从Base重新定义现有的setup方法。如果您希望调用Base的版本,请使用super。
https://stackoverflow.com/questions/11403836
复制相似问题