2011-07-05 10 views
4

誰かが私のためにルビー定数ルックアップを説明できますか?具体的には

  • は、あなたが直接OKスコープのconstに言及されている場合::(のような::Foo::Bar
  • とスコープの前に付ける必要がありますか? (ちょうどFoo::Bar
  • この動作が非常に混乱している理由はありますか?

EDIT:それはdoesnのない限り、モジュール/クラスFooで、その後、BarFoo::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

あなたとスコープ の前に付ける必要があります::(のような:: Fooの::バー)

現在の名前空間に同じ名前を持つ別の定数があります。

constconst okを直接参照している場合は、 (ちょうどFoo :: Bar)

現在の名前空間に同じ名前の定数がない場合。つまりその識別子が曖昧でない場合。同様に、曖昧さがなければ、可読性を高めるためにBarを使用することもできます。

なぜこの の動作が紛らわしいのか?

これは、読みやすさと使いやすさのバランスをとっています。ネームスペースを深く掘り下げているときに、::Foo::Bar::Baz::Boo(グローバルに一意な識別子)を行う必要は必ずしもありません。

+0

私が話している奇妙さについて少しはっきりしていました –

+0

2番目の例では、Foo :: Bar名前空間だけが有効範囲に入ります。 OTOHでは、最初の例のように明示的に各名前空間を開くと、FooとFoo :: Barの両方がスコープに入れられます。 – Ian

+0

それはかなり奇妙ですが、それを説明します。どちらの構文でもクラスにつながるすべてのモジュールを検索すると仮定しました。 2つの構文間の他の違いについて知っていますか? –

0

ようなものについて話していますその場合は::Barを意味する)

私はルビーにも新しいので、塩の穀物でそれを取ってください。 :-P

関連する問題