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因为它的定义与MusicMusic )的范围相同。

然而,要访问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