Ruby: ¿que hace :: prefix?

89

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::HTTPlugar de ::Net::HTTP, es decir, qué significa cuando se usa ::como prefijo?

ma11hew28
fuente
15
Busqué este tema usando la frase "dos puntos iniciales" y no lo encontré inicialmente; con suerte, este comentario cambiará eso. :)
Nathan Long
@NathanLong Interesante idea. ¿Funcionó? Informe por favor.
Darth Egregious
1
@NathanLong ¡ Funcionó!
coreyward

Respuestas:

220

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::Recorddesde fuera de Musicusted, usaría Music::Record.

Para hacer referencia Music::Recorda Music::EightTrack, simplemente podría usar Recordporque está definido en el mismo alcance (el de Music).

Sin embargo, para acceder al Recordmódulo responsable de la interfaz con su base de datos, Music::EightTrackno puede usarlo simplemente Recordporque Ruby cree que lo desea Music::Record. Fue entonces cuando se usaría el operador de resolución de alcance como prefijo, especificando el alcance mundial / principal: ::Record.

coreyward
fuente
12
Sí, respuesta muy completa. ¡Gracias!
ma11hew28
11
Excelente respuesta. Para su información, no me preocupo por los votos negativos aleatorios. Hay cosas mucho más significativas en la vida.
Darth Egregious
16
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 Netmódulo interno . Para mantener el acceso al Netmódulo exterior , utiliza ::Net.

Guilherme Bernal
fuente