Ruby:模块和超级?

MxL*_*evs 25 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
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.