2011-07-05 17 views
4

更具體地說:有人可以解釋紅寶石不斷查找我嗎?

  • 當你需要用前綴範圍::(如::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 

回答

5

當你需要::(如::富::酒吧)的前綴範圍

當有另一個常量與當前的命名空間相同的名稱。

何時直接引用範圍 const ok? (只是Foo :: Bar)

當在當前命名空間中沒有另一個具有相同名稱的常量時。 IE瀏覽器。當這個標識符是明確的。同樣,如果它是明確的,你可以使用Bar來提高可讀性。

有沒有很好的理由,爲什麼這個 行爲是如此混亂?

它的平衡可讀性和放鬆對特異性使用。當你深入到命名空間時,並不總是需要做::Foo::Bar::Baz::Boo(全局唯一標識符)。

+0

對我談論的奇怪點更加清楚 –

+0

您的第二個示例僅將Foo :: Bar命名空間引入了範圍。 OTOH,當你明確地打開每個命名空間時 - 就像你的第一個例子 - Foo和Foo :: Bar都被引入了範圍。 – Ian

+0

這很奇怪,但會解釋它。我假設它會在任何語法中搜索導致該類的所有模塊。你知道兩種語法之間的其他區別嗎? –

0

在據我瞭解/經歷過:當Foo模塊/類,然後BarFoo::Bar除非它doesn 「T存在 - 在這種情況下,它意味着::Bar

請把它當作一粒鹽,但是,因爲我是新來的紅寶石以及。 :-P