有人可以为我解释ruby常量查找吗?

时间:2011-07-05 20:52:36

标签: ruby constants

更具体地说:

  • 您何时需要在范围前添加::(如::Foo::Bar
  • 什么时候直接引用一个范围的const ok? (只是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

2 个答案:

答案 0 :(得分:5)

  

您何时需要为范围添加前缀   with ::(like :: Foo :: Bar)

当当前命名空间中有另一个具有相同名称的常量时。

  

何时直接引用范围   const好吗? (只是Foo :: Bar)

当前名称空间中没有其他具有相同名称的常量时。 IE浏览器。当该标识符是明确的。同样,如果它是明确的,您可以使用Bar来提高可读性。

  

这有什么好理由   行为是如此令人困惑?

它平衡可读性和易用性与特异性。当您在命名空间深处时,您并不总是希望必须执行::Foo::Bar::Baz::Boo(全局唯一标识符)。

答案 1 :(得分:0)

据我了解/经历过:在模块/类Foo中,Bar引用Foo::Bar,除非它不存在 - 其中case表示::Bar。)

请带上一粒盐,因为我也是红宝石的新手。 :-P