Ruby:::前缀是做什么的?

时间:2011-02-17 18:12:46

标签: ruby namespaces

我正在阅读Artifice的来源并看到:

module Artifice
  NET_HTTP = ::Net::HTTP
  # ...
end

行:https://github.com/wycats/artifice/blob/master/lib/artifice.rb#L6

为什么不只是Net::HTTP代替::Net::HTTP,即使用::作为前缀时的含义是什么?

3 个答案:

答案 0 :(得分:199)

::是范围解析运算符。它的作用决定了模块的范围。例如:

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,您可以使用Music::Record

要引用Music::Record中的Music::EightTrack,您只需使用Record,因为它定义在同一范围内(Music)。

但是,要访问负责与Record数据库连接的Music::EightTrack模块,您不能只使用Record,因为Ruby认为您需要Music::Record。那时您将使用范围解析运算符作为前缀,指定全局/主范围:::Record

答案 1 :(得分:14)

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

答案 2 :(得分:11)

::运算符引用全局范围而不是本地范围。之前也曾问过这个问题。