Estaba leyendo a través de la fuente de Artifice y vi:
module Artifice
NET_HTTP = ::Net::HTTP
# ...
end
línea: https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6
¿Por qué no simplemente hacer en Net::HTTP
lugar de ::Net::HTTP
, es decir, qué significa cuando se usa ::
como prefijo?
ruby
namespaces
ma11hew28
fuente
fuente
Respuestas:
El
::
es el operador de resolución de alcance. Lo que hace es determinar en qué ámbito se puede encontrar un módulo. Por ejemplo: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
Para acceder
Music::Record
desde fuera deMusic
usted, usaríaMusic::Record
.Para hacer referencia
Music::Record
aMusic::EightTrack
, simplemente podría usarRecord
porque está definido en el mismo alcance (el deMusic
).Sin embargo, para acceder al
Record
módulo responsable de la interfaz con su base de datos,Music::EightTrack
no puede usarlo simplementeRecord
porque Ruby cree que lo deseaMusic::Record
. Fue entonces cuando se usaría el operador de resolución de alcance como prefijo, especificando el alcance mundial / principal:::Record
.fuente
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
En el caso específico de Artifice, en la línea 41 del archivo que has mostrado se define un
Net
módulo interno . Para mantener el acceso alNet
módulo exterior , utiliza::Net
.fuente
Un
::
operador se refiere al ámbito global en lugar de local.fuente