Ruby:::前缀有什么作用?


87

我正在阅读Artifice的来源,发现:

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

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

为什么不做Net::HTTP而不是做::Net::HTTP,即当您::用作前缀时是什么意思?


15
我使用短语“前导冒号”搜索了此主题,但最初并未找到它。希望这个评论会改变这一点。:)
内森·朗

@NathanLong有趣的想法。奏效了吗?请报告。
Darth Egregious 2015年

Answers:


219

::是范围解析操作。它的作用是确定可以在哪个作用域下找到模块。例如:

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::RecordMusic::EightTrack您可以简单地使用Record它,因为它是在的同一范围内定义的Music

但是,由于Ruby认为您想要从中访问Record负责与数据库接口的模块,因此Music::EightTrack您不能仅仅使用。那时,您将使用范围解析运算符作为前缀,并指定了全局/主范围:。RecordMusic::Record::Record


12
是的,答案很彻底。谢谢!
ma11hew28 '02

11
极好的答案。仅供参考,我不用担心随机否决票。生活中还有更有意义的事情。
Darth Egregious 2015年

16
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的特定情况下,在您显示的文件的第41行定义了一个内部Net模块。为了访问外部Net模块,它使用::Net


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.