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?


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.


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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.