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

ma1*_*w28 81 ruby namespaces

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

module Artifice
  NET_HTTP = ::Net::HTTP
  # ...
end
Run Code Online (Sandbox Code Playgroud)

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

为什么不做,Net::HTTP而不是::Net::HTTP,当你::用作前缀时它意味着什么?

cor*_*ard 203

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

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
Run Code Online (Sandbox Code Playgroud)

要从Music::Record外面访问Music你会使用Music::Record.

要引用Music::RecordMusic::EightTrack您可以简单地使用Record,因为它是在同一范围内(即定义Music).

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

  • 是的,非常彻底的回答.谢谢! (12认同)
  • 很好的答案.我们不担心随机下来的选票.生活中有更多有意义的事情. (11认同)

Gui*_*nal 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
Run Code Online (Sandbox Code Playgroud)

在Artifice的特定情况下,在您显示的文件的第41行定义了一个内部Net模块.为了保持对外部Net模块的访问,它使用::Net.


yan*_*yan 10

一个::运营商是指在全球范围内,而不是本地的.之前也曾问过这个问题.

  • 谢谢.我还找到了[Ruby中的范围解析运算符]的解释(http://phrogz.net/programmingruby/language.html#scopeofconstantsandvariables). (2认同)