Ruby:模块和超级?

时间:2012-07-09 21:58:28

标签: 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

基本上我有一个“基础”模块,它设置了一些东西。我还有一个插件模块,如果某个类想要包含它,它会设置更多的东西。

现在当我测试它时,如果我没有那个超级电话,我会得到

nil
2

当我有超级电话时,我会

1
2

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

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

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

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

1 个答案:

答案 0 :(得分:29)

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

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

Addon模块(包含在内)从setup重新定义现有的Base方法。如果您希望调用Base的版本,请使用super