前缀是做什么的?

我通读了 诡计的来源,看到:

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

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

为什么不干脆用 Net::HTTP而不是 ::Net::HTTP,也就是说,当你使用 ::作为前缀时意味着什么?

16955 次浏览

A :: operator refers to the global scope instead of local.

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.

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.