Ruby: apa yang dilakukan :: prefix?

89

Saya membaca sumber Artifice dan melihat:

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

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

Mengapa tidak lakukan Net::HTTPsaja ::Net::HTTP, yaitu, apa artinya bila Anda menggunakan ::sebagai prefiks?

ma11hew28
sumber
15
Saya mencari topik ini menggunakan frase "leading colons" dan tidak menemukannya pada awalnya; semoga komentar ini mengubah itu. :)
Nathan Long
@NathanLong Ide yang menarik. Apa itu bekerja? Tolong laporkan kembali.
Darth Egregious
1
@NathanLong Berhasil !
Coreyward

Jawaban:

220

Ini ::adalah operator resolusi cakupan. Apa yang dilakukannya adalah menentukan ruang lingkup apa yang dapat ditemukan modul. Sebagai contoh:

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

Untuk mengakses Music::Recorddari luar MusicAnda akan menggunakan Music::Record.

Untuk referensi Music::Recorddari Music::EightTrackAnda bisa menggunakan Recordkarena itu didefinisikan dalam lingkup yang sama (yaitu Music).

Namun, untuk mengakses Recordmodul yang bertanggung jawab untuk berinteraksi dengan database Music::EightTrackAnda, Anda tidak bisa begitu saja menggunakan Recordkarena menurut Ruby Anda menginginkannya Music::Record. Saat itulah Anda akan menggunakan operator resolusi lingkup sebagai awalan, menentukan lingkup global / utama: ::Record.

ke inti
sumber
12
Ya, jawaban yang sangat teliti. Terima kasih!
ma11hew28
11
Jawaban yang sangat bagus. FYI tidak khawatir tentang suara acak yang turun. Ada hal yang jauh lebih berarti dalam hidup.
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

Pada kasus khusus Artifice, di baris 41 file yang Anda tunjukkan didefinisikan sebagai Netmodul dalam . Untuk menjaga akses ke Netmodul luar , ia menggunakan ::Net.

Guilherme Bernal
sumber