Ruby :::プレフィックスは何をするのですか?


88

私はArtificeのソースを読んでいて、次のことを見ました。

module Artifice
  NET_HTTP = ::Net::HTTP
  # ...
end

行:https//github.com/wycats/artifice/blob/master/lib/artifice.rb#L6

Net::HTTP代わりに::Net::HTTP、つまり、::プレフィックスとして使用する場合はどういう意味ですか?


15
「先頭のコロン」というフレーズを使用してこのトピックを検索しましたが、最初は見つかりませんでした。うまくいけば、このコメントはそれを変えるでしょう。:)
ネイサンロング

@NathanLong興味深いアイデア。それは機能しましたか?報告してください。
ダースエグレジャス2015

1
@NathanLongうまくいきました!
coreyward 2015年

回答:


220

::スコープ解決演算子です。それが行うことは、モジュールがどのスコープの下にあるかを決定することです。例えば:

module Music
  module Record
    # perhaps a copy of Abbey Road by The Beatles?
  end

  module EightTrack
    # like Gloria Gaynor, they will survive!
  end
end

module Record
  # for adding an item to the database
end

Music::Record外部からアクセスするにはMusic、を使用しますMusic::Record

から参照Music::Recordするには、同じスコープ(のスコープ)で定義されているため、Music::EightTrack単純に使用できます。RecordMusic

ただし、Recordデータベースとのインターフェースを担当するモジュールにアクセスMusic::EightTrackすることはRecord、Rubyが必要と考えているため、使用することはできませんMusic::Record。その場合、スコープ解決演算子をプレフィックスとして使用し、グローバル/メインスコープを指定します::Record


12
はい、非常に徹底的な答えです。ありがとう!
ma11hew28 2011

11
素晴らしい答え。参考までに、ランダムな反対票については心配していません。人生にはもっと意味のあることがあります。
ダースエグレジャス2015

16
module A
  def self.method; "Outer"; end
end
module B
  module A
    def self.method; "Inner"; end
  end
  A.method   # => "Inner"
  ::A.method # => "Outer"
end

Artificeの特定のケースでは、表示したファイルの41行目に内部Netモジュールが定義されています。外部Netモジュールへのアクセスを維持するために、を使用し::Netます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.