Ruby: que fait :: prefix?

Je lisais à travers 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.-à-d. Que signifie-t-il lorsque vous utilisez :: comme préfixe?

Le :: est l’opérateur de résolution de scope. Qu’est-ce qu’il fait est de déterminer quelle scope un module peut être trouvé sous. 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 dehors de la Music , utilisez Music::Record .

Pour faire référence à Music::Record from 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 d’ Record chargé d’interagir avec votre firebase database à partir de Music::EightTrack vous ne pouvez pas simplement utiliser Record car Ruby pense que vous voulez Music::Record . C’est alors que vous utiliseriez l’opérateur de résolution de scope comme préfixe, en spécifiant la scope 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 

Sur le cas spécifique de Artifice, à la ligne 41 du fichier que vous avez montré est défini un module Net interne. Pour conserver l’access au module externe, il utilise ::Net .

Un opérateur :: fait référence à la scope globale au lieu de locale. Cette question a également été posée auparavant.