【问题标题】: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!

标签: ruby namespaces


【解决方案1】:

:: 运算符指的是全局范围而不是本地范围。

【讨论】:

【解决方案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

    【讨论】:

    • 是的,非常彻底的答案。谢谢!
    • 优秀的答案。仅供参考,我不担心随机投反对票。生活中还有更有意义的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2012-06-25
    相关资源
    最近更新 更多