86 votes

solutions au message ennuyeux "warning : already initialized constant" (avertissement : constante déjà initialisée)

Aujourd'hui, je suis tombé sur un problème délicat avec les constantes Ruby. Dans notre équipe, quelqu'un a créé un module, qui est inclus dans plusieurs modèles. Dans notre sortie de test (spec), cela se traduit par des messages d'avertissement tels que :

/home/ayrton/project/lib/life_cycle.rb:5 : avertissement : déjà initialisé constante RESET

Une façon de résoudre ce problème est de déclarer vos constantes comme ceci :

module LifeCycle

  unless (const_defined?(:RESET))
    RESET = 'reset'
  end

  #...
end

J'ai également lu un article de blog, écrit par Avdi Grimm, qui propose une alternative solution Je me demandais quelle était votre opinion à ce sujet.

145voto

Matthew Leonard Points 1725

J'ai rencontré ce même problème aujourd'hui et j'ai trouvé une solution simple.

Puisque l'avertissement provient d'une tentative de réaffectation d'une constante avec la même valeur, j'ai juste modifié

module LifeCycle
  RESET = 'reset'
end

à

module LifeCycle
  RESET ||= 'reset'
end

Cela a permis de régler le problème de l'avertissement et c'est beaucoup plus simple que de vérifier si chaque constante est définie. Faites-moi savoir si vous trouvez une meilleure solution.

25voto

sheldonh Points 1173

Ce n'est un problème que dans les applications qui se rechargent explicitement, comme les applications Rails.

Si la verbosité vous choque, vous pouvez utiliser unless comme modificateur de déclaration :

module LifeCycle
  RESET = 'reset' unless const_defined?(:RESET)
end

Cela laisse quelques arguments faibles contre la suggestion d'Avdi de n'utiliser que des méthodes :

  • La recherche de constantes est plus rapide que la recherche de méthodes,
  • les valeurs constantes sont définies à la charge, et non à la (première) demande,
  • Les constantes suggèrent visuellement qu'il n'est pas nécessaire de les dériver.

Si vous aimez suffisamment la suggestion d'Avdi pour ignorer ces éléments, faites-le.

5voto

Luis Pizana Points 91

RESET n'est pas une constante si elle change constamment dans votre code. Si vous la renommez en minuscule 'reset', le problème disparaît. Ruby pense que les variables en majuscules sont des constantes et affiche donc une erreur pour vous avertir qu'une constante a changé.

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