为什么重新打开嵌套模块会根据使用的语法给出不同的结果?例如,这很好用:
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/