Ruby: what does :: prefix do?

RubyNamespaces

Ruby Problem Overview


I was reading through the source of Artifice and saw:

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

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

Why not just do Net::HTTP instead of ::Net::HTTP, i.e., what does it mean when you use :: as a prefix?

Ruby Solutions


Solution 1 - Ruby

The :: is the scope resolution operator. What it does is determines what scope a module can be found under. For example:

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

To access Music::Record from outside of Music you would use Music::Record.

To reference Music::Record from Music::EightTrack you could simply use Record because it's defined in the same scope (that of Music).

However, to access the Record module responsible for interfacing with your database from Music::EightTrack you can't just use Record because Ruby thinks you want Music::Record. That's when you would use the scope resolution operator as a prefix, specifying the global/main scope: ::Record.

Solution 2 - Ruby

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

On the specific case of Artifice, at line 41 of the file that you've shown is defined a inner Net module. To keep acess to the outer Net module, it uses ::Net.

Solution 3 - Ruby

A :: operator refers to the global scope instead of local.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionma11hew28View Question on Stackoverflow
Solution 1 - RubycoreywardView Answer on Stackoverflow
Solution 2 - RubyGuilherme BernalView Answer on Stackoverflow
Solution 3 - RubyyanView Answer on Stackoverflow