Ruby: cosa fa :: prefix?


89

Stavo leggendo la fonte di Artifice e ho visto:

module Artifice
  NET_HTTP = ::Net::HTTP
  # ...
end

linea: https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6

Perché non fai semplicemente Net::HTTPinvece di ::Net::HTTP, cioè cosa significa quando usi ::come prefisso?


15
Ho cercato questo argomento utilizzando la frase "due punti iniziali" e inizialmente non l'ho trovato; si spera che questo commento cambierà la situazione. :)
Nathan Long il

@NathanLong Idea interessante. Ha funzionato? Si prega di fare rapporto.
Darth Egregious

1
@NathanLong Ha funzionato!
coreyward

Risposte:


220

Il ::è l'operatore di risoluzione dell'ambito. Ciò che fa è determinare in quale ambito è possibile trovare un modulo. Per esempio:

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

Per accedere Music::Recorddall'esterno Musicuseresti Music::Record.

Per fare riferimento Music::Recordda Music::EightTrackpuoi semplicemente usare Recordperché è definito nello stesso ambito (quello di Music).

Tuttavia, per accedere al Recordmodulo responsabile dell'interfacciamento con il tuo database Music::EightTracknon puoi usarlo semplicemente Recordperché Ruby pensa che tu lo voglia Music::Record. Questo è quando si usa l'operatore di risoluzione dell'ambito come prefisso, specificando la portata globale / main: ::Record.


12
Sì, risposta molto approfondita. Grazie!
ma11hew28

11
Ottima risposta. Cordiali saluti, non mi preoccupo dei voti negativi casuali. Ci sono cose molto più significative nella vita.
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

Nel caso specifico di Artifice, alla riga 41 del file che hai mostrato è definito un Netmodulo interno . Per mantenere l'accesso al Netmodulo esterno , utilizza ::Net.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.