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: :: 前缀有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

以冒号为前缀的单词在 Ruby 中的作用是啥? [复制]

有啥作用!意味着在 Ruby 方法定义的末尾? [复制]

用“+”运算符为对象添加前缀有啥作用? [复制]

"||=" 在 Ruby 1.9.2 中有啥作用? [复制]

Ruby 方法“to_sym”有啥作用?

GHCi“让”——它有啥作用?