ruby - section - wbr tag in html5
Ruby: ¿qué hace:: prefijo? (3)
The ::
es el operador de resolución de alcance. Lo que hace es determinar en qué alcance 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 a Music::Record
desde fuera de Music
, debe usar Music::Record
.
Para hacer referencia a Music::Record
from Music::EightTrack
puedes simplemente usar Record
porque está definido en el mismo ámbito (el de Music
).
Sin embargo, para acceder al módulo de Record
responsable de la interfaz con su base de datos desde Music::EightTrack
no puede usar el Record
porque Ruby cree que quiere Music::Record
. Ahí es cuando usaría el operador de resolución de alcance como un prefijo, especificando el alcance global / principal: ::Record
.
Estaba leyendo 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 Net::HTTP
lugar de ::Net::HTTP
, es decir, qué significa cuando usas ::
como prefijo?
Un operador ::
refiere al alcance global en lugar de local. Esta pregunta también se ha hecho antes.
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 ha mostrado se define un módulo Net
interno. Para mantener el acceso al módulo Net
externo, usa ::Net
.