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

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

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

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

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

Ответ 1

:: - оператор разрешения области. То, что он делает, определяет, в какой области может быть найден модуль. Например:

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.

Ответ 2

Оператор A :: ссылается на глобальную область действия вместо локальной. Этот вопрос также был задан раньше.

Ответ 3

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.