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