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::HTTP
zamiast ::Net::HTTP
, tj. Co to znaczy, gdy używasz ::
jako przedrostka?
ruby
namespaces
ma11hew28
źródło
źródło
Odpowiedzi:
::
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::Record
z zewnątrzMusic
, użyjMusic::Record
.Aby odwołać się
Music::Record
odMusic::EightTrack
ciebie, możesz po prostu użyć,Record
ponieważ jest zdefiniowany w tym samym zakresie (tym zMusic
).Jednak aby uzyskać dostęp do
Record
modułu odpowiedzialnego za łączenie się z twoją bazą danychMusic::EightTrack
, nie możesz po prostu użyć tego,Record
ponieważ Ruby uważa, że chceszMusic::Record
. To wtedy należy użyć operatora rozdzielczość zakres jako przedrostek określający globalną / main zakresu:::Record
.źródło
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
Net
moduł wewnętrzny . Aby zachować dostęp doNet
modułu zewnętrznego , używa::Net
.źródło
::
Operatora odnosi się do zakresu globalnych zamiast lokalnego.źródło