solutions au message “avertissement: constante déjà initialisé”

Aujourd’hui, je suis tombé sur une question délicate avec les constantes Ruby. Dans notre équipe, quelqu’un a créé un module qui est inclus dans plusieurs modèles. Dans notre test (de spécifications), affichez ces résultats dans des messages d’avertissement tels que:

/home/ayrton/project/lib/life_cycle.rb:5: avertissement: constante déjà initialisée 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 solution alternative . Je me demandais quelles étaient vos opinions à ce sujet.

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

L’avertissement étant d’essayer de réaffecter une constante de même valeur, je viens de changer

 module LifeCycle RESET = 'reset' end 

à

 module LifeCycle RESET ||= 'reset' end 

Cela a pris en compte l’avertissement et est beaucoup plus simple que de vérifier si chaque constante est définie. Faites-moi savoir si vous trouvez une meilleure solution.

Ceci n’est qu’un problème dans les applications qui rechargent explicitement, comme les applications Rails.

Si la verbosité vous offense, vous pouvez utiliser à unless qu’en tant que modificateur d’instruction:

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

Cela laisse quelques arguments faibles contre la suggestion d’Avdi d’utiliser uniquement des méthodes:

  • la recherche constante est plus rapide que la recherche de méthode,
  • les valeurs constantes sont définies sur charge, pas sur (première) requête,
  • Les constantes suggèrent visuellement qu’elles ne nécessitent aucun travail pour

Si vous aimez la suggestion d’Avdi pour les ignorer, allez-y.

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

J’ai eu cette erreur dans Ruby quand Intellij IDE .. Cela était dû au nom de la variable déclaré commençant par une majuscule.