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?


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.


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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.