Gly*_*ton 7 ruby nested module
为什么重新打开嵌套模块会根据使用的语法给出不同的结果?例如,这工作正常:
module A
module E
end
end
module A
module E
def E.e
end
end
end
Run Code Online (Sandbox Code Playgroud)
但是这个:
module A
module E
end
end
module A::E
def E.e
end
end
Run Code Online (Sandbox Code Playgroud)
给出错误:
reopen.rb:6:in `<module:E>': uninitialized constant A::E::E (NameError)
from reopen.rb:5:in `<main>'
Run Code Online (Sandbox Code Playgroud)
(在有人指出这一点之前,解决方法是self在定义Ee时使用而不是模块名称,但这不是这篇文章的重点.)
该module关键字设置一个名称空间上下文,用于检查对现有模块名称的引用。然后从内到外搜索这些命名空间以解析对模块(和类)名称的引用。
在第一个示例中,看起来您可能需要定义E.einsidemodule E块,但实际上您不需要:
module A
module E
end
end
module A
def E.e
end
end
Run Code Online (Sandbox Code Playgroud)
在您的两个示例中发生的情况是,Ruby 查看当前名称空间,并尝试<namespace>::E作为模块名称。因此,在这两个示例中,它首先检查的实际上是A::E::E不存在的。然后它回到下一个上下文。这就是示例的不同之处:在第一个示例中,哪个是A::E有效的,在第二个示例中,哪个是E无效的。然后它抛出的错误与它检查的第一个名称有关。
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |