web-dev-qa-db-fra.com

Ruby: que fait :: prefix?

Je lisais la source de Artifice et j'ai vu:

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

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

Pourquoi ne pas simplement faire Net::HTTP au lieu de ::Net::HTTP, c'est-à-dire qu'est-ce que cela signifie lorsque vous utilisez :: comme préfixe?

84
ma11hew28

Le :: est l'opérateur de résolution de la portée. Il détermine la portée sous laquelle un module peut être trouvé. Par exemple:

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

Accéder Music::Record de l'extérieur de Music vous utiliseriez Music::Record.

Pour référencer Music::Record de Music::EightTrack vous pouvez simplement utiliser Record car il est défini dans la même étendue (celle de Music).

Cependant, pour accéder au module Record responsable de l'interfaçage avec votre base de données depuis Music::EightTrack vous ne pouvez pas simplement utiliser Record parce que Ruby pense que vous voulez Music::Record. C'est à ce moment que vous utiliseriez l'opérateur de résolution de portée comme préfixe, en spécifiant la portée globale/principale: ::Record.

205
coreyward
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

Dans le cas particulier d'Artifice, à ligne 41 du fichier que vous avez montré est défini un module interne Net. Pour garder accès au module Net externe, il utilise ::Net.

14
Guilherme Bernal

UNE :: L'opérateur fait référence à la portée globale au lieu de locale. Cette question a également été posée auparavant.

11
yan