96 votes

Ruby : que fait le préfixe :: ?

Je lisais la source de Artifice et a 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 quand vous utilisez :: comme préfixe ?

16 votes

J'ai cherché ce sujet en utilisant l'expression "leading colons" et je ne l'ai pas trouvé initialement ; j'espère que ce commentaire changera cela. :)

0 votes

@NathanLong Idée intéressante. Cela a-t-il fonctionné ? Veuillez nous en faire part.

1 votes

@NathanLong Ça a marché !

239voto

coreyward Points 26109

Le site :: est l'opérateur de résolution de la portée. Son rôle est de déterminer sous quelle portée se trouve un module. 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

Pour accéder à Music::Record de l'extérieur de Music vous utiliseriez Music::Record .

En référence Music::Record de Music::EightTrack vous pourriez simplement utiliser Record parce qu'il est défini dans la même portée (celle de Music ).

Cependant, pour accéder à l Record responsable de l'interface avec votre base de données à partir de Music::EightTrack vous ne pouvez pas simplement utiliser Record parce que Ruby pense que tu veux Music::Record . C'est dans ce cas que vous utiliserez l'opérateur de résolution de portée comme préfixe, en spécifiant la portée globale/principale : ::Record .

12 votes

Oui, réponse très complète. Merci !

11 votes

Excellente réponse. Pour info, ne vous inquiétez pas des votes négatifs aléatoires. Il y a des choses bien plus significatives dans la vie.

16voto

Guilherme Bernal Points 5789
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

Sur le cas spécifique d'Artifice, à l'adresse suivante ligne 41 du fichier que vous avez montré est défini comme un intérieur Net module. Pour garder l'accès à l'extérieur Net il utilise ::Net .

13voto

yan Points 13348

A :: fait référence à la portée globale au lieu de locale.

2 votes

Merci. J'ai également trouvé une explication de la opérateur de résolution de portée en Ruby .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X