gpt4 book ai didi

Ruby:模块和 super ?

转载 作者:数据小太阳 更新时间:2023-10-29 06:28:36 26 4
gpt4 key购买 nike

我不明白为什么会这样。

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

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

现在当我测试它时,如果我没有那个 super 调用,我会得到

nil
2

当我接到 super 电话时,我得到

1
2

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

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

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

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

最佳答案

是的,当你包含模块时,它们被注入(inject)到继承链中

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

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

关于Ruby:模块和 super ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11403836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com