Рубин:что делает префикс?
Я читал через источник хитрости и увидел:
module Artifice
NET_HTTP = ::Net::HTTP
# ...
end
строка:https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6
Почему бы просто не сделать Net::HTTP
вместо ::Net::HTTP
, т. е., что это значит, когда вы используете ::
как префикс?
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
.