我正在阅读Artifice的来源,发现:
module Artifice
NET_HTTP = ::Net::HTTP
# ...
end
行:https : //github.com/wycats/artifice/blob/master/lib/artifice.rb#L6
为什么不做Net::HTTP
而不是做::Net::HTTP
,即当您::
用作前缀时是什么意思?
我正在阅读Artifice的来源,发现:
module Artifice
NET_HTTP = ::Net::HTTP
# ...
end
行:https : //github.com/wycats/artifice/blob/master/lib/artifice.rb#L6
为什么不做Net::HTTP
而不是做::Net::HTTP
,即当您::
用作前缀时是什么意思?
Answers:
该::
是范围解析操作。它的作用是确定可以在哪个作用域下找到模块。例如:
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
。
但是,由于Ruby认为您想要从中访问Record
负责与数据库接口的模块,因此Music::EightTrack
您不能仅仅使用。那时,您将使用范围解析运算符作为前缀,并指定了全局/主范围:。Record
Music::Record
::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
在Artifice的特定情况下,在您显示的文件的第41行定义了一个内部Net
模块。为了访问外部Net
模块,它使用::Net
。