Ruby: що робить :: префікс?


87

Я читав джерело 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 Цікава ідея. Це спрацювало? Будь ласка, повідомте про це.
Дарт Егрегіо

Відповіді:


219

::Оператор дозволу області видимості. Те, що він робить, визначає, в якому обсязі модуль можна знайти. Наприклад:

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вас можна просто використовувати, Recordоскільки це визначено в тому ж обсязі (що і Music).

Однак для доступу до Recordмодуля, відповідального за взаємодію з вашою базою даних, Music::EightTrackви не можете просто скористатися Recordтим, що Ruby вважає, що ви хочете Music::Record. Ось коли ви будете використовувати оператор дозволу області видимості в якості префікса, вказавши глобальний / основний об'єм: ::Record.


12
Так, дуже ґрунтовна відповідь. Дякую!
ma11hew28

11
Відмінна відповідь. FYI не турбується про випадкові голоси проти. У житті є набагато більш значущі речі.
Дарт Егрегіо

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.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.