gpt4 book ai didi

ruby - 重开Ruby嵌套模块异常

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

为什么重新打开嵌套模块会根据使用的语法给出不同的结果?例如,这很好用:

module A
module E
end
end
module A
module E
def E.e
end
end
end

但是这个:

module A
module E
end
end
module A::E
def E.e
end
end

给出错误:

reopen.rb:6:in `<module:E>': uninitialized constant A::E::E (NameError)
from reopen.rb:5:in `<main>'

(在有人指出这一点之前,解决方法是在定义 E.e 时使用 self 而不是模块名称,但这不是本文的重点。)

最佳答案

module关键字设置一个命名空间上下文,检查对现有模块名称的引用。然后从内到外搜索这些 namespace ,以解析对模块(和类)名称的引用。

在您的第一个示例中,看起来您可能需要定义 E.e里面module E阻止,但实际上你没有:

module A
module E
end
end
module A
def E.e
end
end

在您的两个示例中发生的是 Ruby 查看当前命名空间,并尝试 <namespace>::E作为模块名称。所以在这两个例子中,它检查的第一件事实际上是 A::E::E这是不存在的。然后它回到下一个上下文。示例的不同之处在于:在第一个示例中,它是 A::E这是有效的,在第二个例子中,它只是 E这不是。然后它抛出的错误与它检查的名字有关。

关于ruby - 重开Ruby嵌套模块异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17589997/

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