Рубин:что делает префикс?


Я читал через источник хитрости и увидел:

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

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

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

3 75

3 ответа:

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

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 потому что Руби думает, что ты хочешь Music::Record. Вот когда вы будете использовать оператор разрешения области в качестве префикса, указав глобальную / основную область:::Record.

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

на конкретном случае искусственности, в строка 41 из файла, который вы показали определяется внутренний Net модуль. Чтобы сохранить доступ к внешнему Net модуль, он использует ::Net.

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