Ruby: что делает префикс ::?

89

Я читал источник Artifice и увидел:

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

строка: https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6

Почему бы просто не сделать Net::HTTPвместо ::Net::HTTP, т.е. что это значит, когда вы используете ::в качестве префикса?

ma11hew28
источник
15
Я искал эту тему, используя фразу «ведущие двоеточия», и изначально не нашел ее; надеюсь, этот комментарий изменит это. :)
Натан Лонг
@NathanLong Интересная идея. Это сработало? Пожалуйста, доложите.
Дарт Эгрегиос
1
@NathanLong Это сработало!
Coreyward

Ответы:

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вы могли бы просто использовать , Recordтак как он определен в том же объеме (что в Music).

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

Коривард
источник
12
Да, очень обстоятельный ответ. Благодарность!
ma11hew28
11
Отличный ответ. К вашему сведению, я не беспокоюсь о случайных голосах против. В жизни есть гораздо более важные вещи.
Дарт Эгрегиус
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.

Гильерме Берналь
источник