首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby:模块和超级模块?

Ruby:模块和超级模块?
EN

Stack Overflow用户
提问于 2012-07-10 05:58:28
回答 1查看 9.7K关注 0票数 30

我不明白为什么这样行得通。

代码语言:javascript
复制
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模块,如果某个类想要包含它,它会设置更多的东西。

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

代码语言:javascript
复制
nil
2

当我接到超级电话时,我会得到

代码语言:javascript
复制
1
2

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

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

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

编辑:对于上下文,如果没有基本模块,附加模块将永远不会被包括在内,并且基本模块将始终包含在任何附加附加模块之前。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-10 06:33:26

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

代码语言:javascript
复制
Test.ancestors # => [Test, Addon, Base, Object, Kernel, BasicObject]

当包含Addon模块时,它会从Base重新定义现有的setup方法。如果您希望调用Base的版本,请使用super

票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11403836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档