174 votes

Affectation dynamique des constantes

class MyClass
  def mymethod
    MYCONSTANT = "blah"
  end
end

me donne l'erreur :

SyntaxError : erreur d'affectation d'une constante dynamique

Pourquoi cela est-il considéré comme une constante dynamique ? Je lui attribue simplement une chaîne de caractères.

44 votes

La constante dynamique est quelque chose comme l'eau sèche :)

52 votes

Il n'est pas dit que la constante est dynamique. Il est dit que l'affectation est dynamique.

1voto

John Points 1

Ruby n'apprécie pas que vous assigniez la constante à l'intérieur d'une méthode car cela risque de provoquer une réassignation. Plusieurs réponses de l'OS avant moi donnent l'alternative de l'assigner en dehors d'une méthode - mais dans la classe, qui est un meilleur endroit pour l'assigner.

-1voto

Lorin Ricker Points 71

Un grand merci à Dorian et Phrogz pour m'avoir rappelé l'existence de la méthode #replace pour les tableaux (et les hachages), qui permet de "remplacer le contenu d'un tableau ou d'un hachage".

L'idée que la valeur d'une CONSTANTE puisse être modifiée, mais avec un avertissement gênant, est l'une des rares erreurs conceptuelles de Ruby - ces constantes devraient être totalement immuables, ou bien abandonner complètement l'idée de constante. Du point de vue d'un codeur, une constante est déclarative et intentionnelle, un signal aux autres que "cette valeur est vraiment immuable une fois déclarée/assignée".

Mais parfois, une "déclaration évidente" exclut en fait d'autres possibilités utiles futures. Par exemple...

Il y a sont des cas d'utilisation légitimes où la valeur d'une "constante" pourrait vraiment avoir besoin d'être changée : par exemple, recharger ARGV à partir d'une boucle d'invite de type REPL, puis relancer ARGV à travers plus d'appels (ultérieurs) OptionParser.parse ! Donne aux "args de ligne de commande" une toute nouvelle utilité dynamique.

Le problème pratique est le suivant soit avec l'hypothèse présumée que "ARGV doit être une constante", ou dans la méthode d'initialisation d'optparse, qui code en dur l'assignation de ARGV à l'instance var @default_argv pour le traitement ultérieur -- ce tableau (ARGV) devrait vraiment être un paramètre, encourageant la re-parse et la réutilisation, le cas échéant. Un paramétrage approprié, avec un défaut approprié (disons, ARGV) éviterait de devoir changer la "constante" ARGV. Ce ne sont que quelques réflexions d'une valeur de 2¢...

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