Je lisais la source d' Artifice et j'ai vu:
module Artifice
NET_HTTP = ::Net::HTTP
# ...
end
ligne: https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6
Pourquoi ne pas simplement faire Net::HTTP
au lieu de ::Net::HTTP
, c'est-à-dire, qu'est-ce que cela signifie lorsque vous utilisez ::
comme préfixe?
ruby
namespaces
ma11hew28
la source
la source
Réponses:
Le
::
est l'opérateur de résolution de portée. Il détermine la portée sous laquelle un module peut être trouvé. Par exemple: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
Pour accéder
Music::Record
de l'extérieur deMusic
vous utilisezMusic::Record
.Pour référencer
Music::Record
deMusic::EightTrack
vous pouvez simplement utiliserRecord
car il est défini dans la même portée (celle deMusic
).Cependant, pour accéder au
Record
module responsable de l'interfaçage avec votre base de données,Music::EightTrack
vous ne pouvez pas simplement l'utiliserRecord
parce que Ruby pense que vous le souhaitezMusic::Record
. C'est lorsque vous utilisez l'opérateur de résolution de portée comme préfixe, en précisant la portée globale / main:::Record
.la source
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
Dans le cas spécifique d'Artifice, à la ligne 41 du fichier que vous avez montré est défini un
Net
module interne . Pour garder l'accès auNet
module externe , il utilise::Net
.la source
Un
::
opérateur fait référence à la portée globale au lieu de locale.la source