当使用::?指定模块时,为什么Ruby不能在更高的范围内查找类?

我只是坚持了一段时间。 拿这个基础:

module Top class Test end module Foo end end 

后来,我可以通过这样做在Foo中定义扩展Test的类:

 module Top module Foo class SomeTest < Test end end end 

但是,如果我尝试通过使用::来指定模块来最小化缩进:

 module Top::Foo class Failure < Test end end 

这失败了:

NameError:未初始化的常量Top :: Foo :: Test

这是一个错误,还是只是Ruby解析变量名称的逻辑结果?

这是一个错误,还是一个合乎逻辑的后果

这是一个“怪癖”。 有人认为这是一个错误。

用于查找未解析常量的父作用域由模块嵌套确定。 恰巧当你使用module Top::Foo ,它只创建一个嵌套级别而不是两个嵌套级别。 注意:

 module Top module Foo class SomeTest Module.nesting # => [Top::Foo::SomeTest, Top::Foo, Top] end end end module Top::Foo class SomeTest Module.nesting # => [Top::Foo::SomeTest, Top::Foo] end end 

这是预料之中的。 使用::更改常量查找的范围,并期望在Top::Foo下定义Test

要获得预期的结果,您可以写:

 module Top::Foo class SomeTest < Top::Test end end 

要么:

 module Top class Foo::SomeTest < Test end end 

甚至:

 class Top::Foo::SomeTest < Top::Test end