Ruby: co robi :: prefix?

89

Czytałem źródło Artifice i zobaczyłem:

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

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

Dlaczego po prostu nie zrobić Net::HTTPzamiast ::Net::HTTP, tj. Co to znaczy, gdy używasz ::jako przedrostka?

ma11hew28
źródło
15
Szukałem tego tematu, używając frazy „początkowe dwukropki” i początkowo go nie znalazłem; miejmy nadzieję, że ten komentarz to zmieni. :)
Nathan Long
@NathanLong Ciekawy pomysł. Zadziałało? Zgłoś się ponownie.
Darth Egregious
1
@NathanLong To działało!
coreyward

Odpowiedzi:

220

::Jest operatorem zakres rozdzielczości. To, co robi, określa, w jakim zakresie można znaleźć moduł. Na przykład:

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

Aby uzyskać dostęp Music::Recordz zewnątrz Music, użyj Music::Record.

Aby odwołać się Music::Recordod Music::EightTrackciebie, możesz po prostu użyć, Recordponieważ jest zdefiniowany w tym samym zakresie (tym z Music).

Jednak aby uzyskać dostęp do Recordmodułu odpowiedzialnego za łączenie się z twoją bazą danych Music::EightTrack, nie możesz po prostu użyć tego, Recordponieważ Ruby uważa, że ​​chcesz Music::Record. To wtedy należy użyć operatora rozdzielczość zakres jako przedrostek określający globalną / main zakresu: ::Record.

coreyward
źródło
12
Tak, bardzo dokładna odpowiedź. Dzięki!
ma11hew28
11
Doskonała odpowiedź. FY, nie martwię się o losowe głosy negatywne. W życiu są rzeczy o wiele bardziej znaczące.
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

W konkretnym przypadku Artifice, w linii 41 pokazanego pliku zdefiniowano Netmoduł wewnętrzny . Aby zachować dostęp do Netmodułu zewnętrznego , używa ::Net.

Guilherme Bernal
źródło