Ruby: :: 前缀有啥作用?
Posted
技术标签:
【中文标题】Ruby: :: 前缀有啥作用?【英文标题】:Ruby: what does :: prefix do?Ruby: :: 前缀有什么作用? 【发布时间】:2011-06-29 07:18:32 【问题描述】:我正在阅读Artifice的来源并看到:
module Artifice
NET_HTTP = ::Net::HTTP
# ...
end
线路:https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6
为什么不直接使用Net::HTTP
而不是::Net::HTTP
,即使用::
作为前缀是什么意思?
【问题讨论】:
我使用短语“前导冒号”搜索了这个主题,但最初没有找到;希望这条评论会改变这一点。 :) @NathanLong 有趣的想法。它奏效了吗?请回来报告。 @NathanLong It worked! 【参考方案1】:::
运算符指的是全局范围而不是本地范围。
【讨论】:
谢谢。我还找到了scope resolution operator in Ruby的解释。【参考方案2】: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
。
【讨论】:
【参考方案3】:::
是范围解析运算符。它的作用是确定可以在什么范围内找到模块。例如:
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
。
【讨论】:
是的,非常彻底的答案。谢谢! 优秀的答案。仅供参考,我不担心随机投反对票。生活中还有更有意义的事情。以上是关于Ruby: :: 前缀有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章