Je lisais la source de 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?
Le ::
est l'opérateur de résolution de la 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
Accéder Music::Record
de l'extérieur de Music
vous utiliseriez Music::Record
.
Pour référencer Music::Record
de Music::EightTrack
vous pouvez simplement utiliser Record
car il est défini dans la même étendue (celle de Music
).
Cependant, pour accéder au module Record
responsable de l'interfaçage avec votre base de données depuis Music::EightTrack
vous ne pouvez pas simplement utiliser Record
parce que Ruby pense que vous voulez Music::Record
. C'est à ce moment que vous utiliseriez l'opérateur de résolution de portée comme préfixe, en spécifiant la portée globale/principale: ::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
Dans le cas particulier d'Artifice, à ligne 41 du fichier que vous avez montré est défini un module interne Net
. Pour garder accès au module Net
externe, il utilise ::Net
.
UNE ::
L'opérateur fait référence à la portée globale au lieu de locale. Cette question a également été posée auparavant.