当使用::?指定模块时,为什么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