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?


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.


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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.