我通读了一下Artifice的源代码,发现:
module Artifice
NET_HTTP = ::Net::HTTP
# ...
end
线路:https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6
为什么不直接使用Net::HTTP
而不是::Net::HTTP
,也就是说,当你使用::
作为前缀时,这意味着什么?
发布于 2011-02-18 02:31:45
::
是作用域解析操作符。它所做的是确定一个模块可以在什么范围内找到。例如:
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
外部访问Music::Record
,您需要使用Music::Record
。
要从Music::EightTrack
引用Music::Record
,可以简单地使用Record
,因为它是在相同的作用域(Music
的作用域)中定义的。
然而,要从Music::EightTrack
访问负责与数据库交互的Record
模块,您不能只使用Record
,因为Ruby认为您需要Music::Record
。这时您可以使用作用域解析操作符作为前缀,指定全局/主作用域:::Record
。
发布于 2011-02-18 02:29:37
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
在特殊情况下,在您所显示的文件的line 41中定义了一个内部Net
模块。为了保持对外部Net
模块的访问,它使用::Net
。
发布于 2011-02-18 02:15:17
::
运算符引用全局作用域,而不是局部作用域。
https://stackoverflow.com/questions/5032844
复制相似问题