更具体地说:
::
(如::Foo::Bar
)Foo::Bar
)module Foo
THING = 'thing'
module Bar
puts THING
end
end
#=> thing
module Foo::Bar
puts THING
end
#=> NameError: uninitialized constant Foo::Bar::THING
答案 0 :(得分:5)
您何时需要为范围添加前缀 with ::(like :: Foo :: Bar)
当当前命名空间中有另一个具有相同名称的常量时。
何时直接引用范围 const好吗? (只是Foo :: Bar)
当前名称空间中没有其他具有相同名称的常量时。 IE浏览器。当该标识符是明确的。同样,如果它是明确的,您可以使用Bar
来提高可读性。
这有什么好理由 行为是如此令人困惑?
它平衡可读性和易用性与特异性。当您在命名空间深处时,您并不总是希望必须执行::Foo::Bar::Baz::Boo
(全局唯一标识符)。
答案 1 :(得分:0)
据我了解/经历过:在模块/类Foo
中,Bar
引用Foo::Bar
,除非它不存在 - 其中case表示::Bar
。)
请带上一粒盐,因为我也是红宝石的新手。 :-P