我正在阅读Artifice的来源并看到:
module Artifice
NET_HTTP = ::Net::HTTP
# ...
end
行:https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6
为什么不只是Net::HTTP
代替::Net::HTTP
,即使用::
作为前缀时的含义是什么?
答案 0 :(得分:199)
::
是范围解析运算符。它的作用决定了模块的范围。例如:
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
要从Music::Record
之外访问Music
,您可以使用Music::Record
。
要引用Music::Record
中的Music::EightTrack
,您只需使用Record
,因为它定义在同一范围内(Music
)。
但是,要访问负责与Record
数据库连接的Music::EightTrack
模块,您不能只使用Record
,因为Ruby认为您需要Music::Record
。那时您将使用范围解析运算符作为前缀,指定全局/主范围:::Record
。
答案 1 :(得分:14)
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
在Artifice的特定情况下,在您显示的文件的line 41处定义了一个内部Net
模块。要继续访问外部Net
模块,它会使用::Net
。
答案 2 :(得分:11)
::
运算符引用全局范围而不是本地范围。之前也曾问过这个问题。