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::HTTP
saja ::Net::HTTP
, yaitu, apa artinya bila Anda menggunakan ::
sebagai prefiks?
ruby
namespaces
ma11hew28
sumber
sumber
Jawaban:
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::Record
dari luarMusic
Anda akan menggunakanMusic::Record
.Untuk referensi
Music::Record
dariMusic::EightTrack
Anda bisa menggunakanRecord
karena itu didefinisikan dalam lingkup yang sama (yaituMusic
).Namun, untuk mengakses
Record
modul yang bertanggung jawab untuk berinteraksi dengan databaseMusic::EightTrack
Anda, Anda tidak bisa begitu saja menggunakanRecord
karena menurut Ruby Anda menginginkannyaMusic::Record
. Saat itulah Anda akan menggunakan operator resolusi lingkup sebagai awalan, menentukan lingkup global / utama:::Record
.sumber
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
Net
modul dalam . Untuk menjaga akses keNet
modul luar , ia menggunakan::Net
.sumber
Sebuah
::
Operator mengacu pada lingkup global, bukan lokal.sumber