Ruby:::前缀是做什么的?
我正在阅读Artifice的来源,看到:
module Artifice NET_HTTP = ::Net::HTTP # ... end
行: https : //github.com/wycats/artifice/blob/master/lib/artifice.rb#L6
为什么不只是做Net::HTTP
而不是::Net::HTTP
,即当你使用::
作为前缀时,这意味着什么?
::
是范围parsing运算符。 它所做的是决定一个模块的范围。 例如:
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::Record
,您可以使用Music::Record
。
要从Music::EightTrack
引用Music::Record
,您可以简单地使用Record
因为它的定义与Music
( Music
)的范围相同。
然而,要访问Music::EightTrack
负责与数据库接口的Record
模块,你不能只使用Record
因为Ruby认为你需要Music::Record
。 那就是当你使用范围parsing操作符作为前缀时,指定全局/主范围::Record
。
A ::
运算符指的是全局范围而不是本地。 这个问题也被问到过。
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的特定情况下,你已经显示的文件的第41行定义了一个内部Net
模块。 为了保持对外部Net
模块的访问,它使用::Net
。