31

我不明白为什么会这样。

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

super 在这里实际上做了什么?它从 Base 模块调用 setup 方法,即使 Base 和 Addon 不相关。

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

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

编辑:就上下文而言,如果没有 Base 模块,就永远不会包含 Addon 模块,并且 Base 模块将始终包含在任何其他 Addon 模块之前。

4

1 回答 1

42

是的,当您包含模块时,它们会被注入到继承链中

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

Addon模块,当包含时,setup从 .重新定义现有方法Base。如果要Base调用 's 版本,请使用super.

于 2012-07-09T22:33:25.590 回答