Ruby: what does :: prefix do?
I was reading through the source of Artifice 开发者_StackOverflowand saw:
module Artifice
NET_HTTP = ::Net::HTTP
# ...
end
line: https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6
Why not just do Net::HTTP
instead of ::Net::HTTP
, i.e., what does it mean when you use ::
as a prefix?
The ::
is the scope resolution operator. What it does is determines what scope a module can be found under. For example:
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
To access Music::Record
from outside of Music
you would use Music::Record
.
To reference Music::Record
from Music::EightTrack
you could simply use Record
because it's defined in the same scope (that of Music
).
However, to access the Record
module responsible for interfacing with your database from Music::EightTrack
you can't just use Record
because Ruby thinks you want Music::Record
. That's when you would use the scope resolution operator as a prefix, specifying the global/main scope: ::Record
.
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
On the specific case of Artifice, at line 41 of the file that you've shown is defined a inner Net
module. To keep acess to the outer Net
module, it uses ::Net
.
A ::
operator refers to the global scope instead of local.
精彩评论