Ruby: o que :: prefix faz?

87

Eu estava lendo a fonte do Artifice e vi:

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

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

Por que não fazer apenas em Net::HTTPvez de ::Net::HTTP, ou seja, o que significa quando você usa ::como prefixo?

ma11hew28
fonte
15
Eu pesquisei esse tópico usando a frase "dois pontos à esquerda" e não o encontrei inicialmente; espero que este comentário mude isso. :)
Nathan Long
@NathanLong Idéia interessante. Funcionou? Por favor, relate.
Darth Egregious,
1
@NathanLong Funcionou!
coreyward de

Respostas:

216

O ::é o operador de resolução do escopo. O que ele faz é determinar em que escopo um módulo pode ser encontrado. Por exemplo:

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

Para acessar Music::Recordde fora de Musicvocê usaria Music::Record.

Para fazer referência a Music::Recordpartir de Music::EightTrackvocê pode simplesmente usar Recordporque está definido no mesmo escopo (o de Music).

Porém, para acessar o Recordmódulo responsável pela interface com seu banco de dados Music::EightTrackvocê não pode simplesmente usar Recordporque Ruby acha que você quer Music::Record. Isso é quando você usar o operador de resolução de escopo como um prefixo, especificando o escopo global / main: ::Record.

Coreyward
fonte
12
Sim, uma resposta muito completa. Obrigado!
ma11hew28
11
Excelente resposta. Para sua informação, não se preocupe com votos aleatórios. Existem coisas muito mais significativas na vida.
Darth Egregious,
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

No caso específico do Artifice, na linha 41 do arquivo que você mostrou está definido um Netmódulo interno . Para manter o acesso ao Netmódulo externo , ele usa ::Net.

Guilherme Bernal
fonte