在Ruby中打开嵌套的模块异常
为什么根据使用的语法重新打开嵌套模块会得到不同的结果? 例如,这工作正常:
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>'
(在有人指出这点之前,解决方法是在定义Ee时使用self
而不是模块名称,但这不是本文的重点。)
module
关键字设置一个名称空间上下文,该名称空间上下文被检查以引用现有的模块名称。 这些名称空间然后从内到外进行搜索以解析对Module(和Class)名称的引用。
在你的第一个例子中,看起来你可能需要在module E
块中定义Ee
,但事实上你不需要:
module A
module E
end
end
module A
def E.e
end
end
在你的例子中会发生什么是Ruby查看当前命名空间,并尝试<namespace>::E
作为模块名称。 所以在这两个例子中,它检查的第一件事实际上是A::E::E
,它不存在。 然后它回落到下一个上下文。 哪个地方的例子不同:在第一个例子中,它是A::E
是有效的,在第二个例子中,它只是E
而不是。 然后它抛出的错误与它检查的名字有关。
上一篇: opened nested module anomaly in Ruby
下一篇: trivial sums of outer products without temporaries in numpy