Dynamique constante d'affectation
class MyClass
def mymethod
MYCONSTANT = "blah"
end
end
me donne l'erreur:
SyntaxError: dynamique constante d'attribution d'erreur
Pourquoi est-ce considéré comme une dynamique constante? Je suis juste l'affectation d'une chaîne à elle.
- Dynamique Constante, c'est quelque chose comme la sécheresse de l'Eau? 🙂
- Cela ne veut pas dire que la constante est dynamique. Il est dit que la cession est dynamique.
Vous devez vous connecter pour publier un commentaire.
Votre problème est que chaque fois que vous exécutez la méthode de l'affectation d'une nouvelle valeur de la constante. Ce n'est pas autorisé, car il rend la constante de non-constante, même si la contenu de la chaîne sont les mêmes (pour le moment, de toute façon), la chaîne objet elle-même est différente à chaque fois que la méthode est appelée. Par exemple:
Peut-être que si vous l'avez expliqué votre cas d'utilisation,—pourquoi vous voulez changer la valeur d'une constante dans une méthode, nous pourrions vous aider avec une meilleure mise en œuvre.
Peut-être que vous préférez avoir une variable d'instance de la classe?
Si vous vraiment souhaitez modifier la valeur d'une constante dans une méthode, et votre constante est une Chaîne de caractères ou un Tableau, vous pouvez "tricher" et de l'utilisation de la
#replace
méthode à cause de l'objet à prendre une nouvelle valeur sans changer l'objet:def initialize(db,user,password) DB=Sequel.connect("postgres://#{user}:#{password}@localhost/#{db}") end
. C'est l'un de ces cas où Ruby a pas de manière simple.@variable
), pas une constante. Sinon vous seriez re-affectation deDB
chaque fois que vous instancié une nouvelle instance de cette classe.Sequel.connect
à une constante appelée DB. En fait, la documentation dit explicitement que c'est juste une recommandation. Cela ne ressemble pas à une contrainte extérieure à moi.Parce que les constantes de Ruby ne sont pas destinées à être changé, Ruby vous déconseille de lui assignant dans les parties de code qui pourraient être exécuté plus d'une fois, comme à l'intérieur des méthodes.
Dans des circonstances normales, vous devez définir la constante à l'intérieur de la classe elle-même:
Si, pour quelque raison que vous avez vraiment besoin de définir une constante à l'intérieur d'une méthode (peut-être pour certains type de métaprogrammation), vous pouvez utiliser
const_set
:Encore une fois cependant,
const_set
n'est pas quelque chose que vous devriez vraiment avoir recours à des circonstances normales. Si vous n'êtes pas sûr de savoir si vous vraiment souhaitez attribuer à des constantes de cette façon, vous pouvez envisager l'une des alternatives suivantes:Variables de classe
Variables de classe se comportent comme des constantes dans de nombreuses façons. Ils sont les propriétés d'une classe, et ils sont accessibles dans les sous-classes de la classe, elles sont définies sur.
La différence est que les variables de classe sont destinés à être modifiables, et peut donc être affectée à l'intérieur des méthodes sans problème.
Attributs de classe
Les attributs de classe sont une sorte de "variable d'instance d'une classe". Ils se comportent un peu comme des variables de classe, sauf que leurs valeurs ne sont pas partagées avec des sous-classes.
Variables d'Instance
Et juste pour être complet, je devrais probablement mentionner: si vous devez attribuer une valeur qui peut être déterminée uniquement après votre classe a été instancié, il ya une bonne chance que vous pourriez réellement être à la recherche d'un simple vieux variable d'instance.
const_set
est la bonne réponse.En Ruby, toutes les variables dont le nom commence par une lettre majuscule est une constante, et vous ne pouvez l'attribuer à la fois. Choisissez l'une de ces alternatives:
Constantes dans ruby ne peut pas être définie à l'intérieur d'méthodes. Voir les notes au bas de cette page, par exemple
Vous ne pouvez pas le nom d'une variable avec des lettres majuscules ou Ruby va asume sa constante et souhaitez en garder une valeur constante, auquel cas la modification de sa valeur serait une erreur "une dynamique constante d'attribution de l'erreur". Avec moins de cas doit être fine
Ruby n'aime pas que vous attribuez les constantes à l'intérieur d'une méthode, car elle risque de ré-affectation. Plusieurs réponses avant de me donner l'alternative de l'affecter à l'extérieur d'une méthode, mais dans la classe, qui est un meilleur endroit pour l'assigner.
Un grand merci à Dorian et Phrogz pour me rappeler à l'ordre le tableau (et de hachage) méthode n ° remplacer, ce qui peut "remplacer le contenu d'un tableau ou de hachage."
La notion qu'une CONSTANTE de valeur peut être changé, mais avec un avertissement ennuyeux, est l'un des Rubis quelques conceptuel mis-étapes-ceux-ci devraient être pleinement immuable, ou vidage de la constante idée tout à fait. À partir d'un point de vue du programmeur, une constante est déclaratif et intentionnelle, un signal pour les autres que "cette valeur est vraiment immuable une fois déclarée/affecté."
Mais parfois, un "évident" déclaration de fait exclut d'autres, l'avenir des occasions utiles. Par exemple...
Il sont utilisation légitime des cas où une "constante" valeur pourriez vraiment besoin d'être changé: par exemple, re-chargement ARGV d'un REPL-comme une boucle, puis en le relançant ARGV thru plus (suite) OptionParser.analyser! les appels-le tour est joué! Donne de la "ligne de commande args" une toute nouvelle dynamique de l'utilitaire.
Le problème pratique est soit avec la présomption hypothèse que "ARGV doit être une constante", ou dans optparse propre méthode initialize, qui dur-codes de la cession de ARGV à l'instance var @default_argv pour un traitement ultérieur -- qui array (ARGV) devrait vraiment être un paramètre, encourager le retour à l'analyser et de le ré-utiliser, le cas échéant. Bon paramétrage, avec un défaut (par exemple, ARGV) permettrait d'éviter la nécessité de toujours changer de la "constante" ARGV. 2¢la valeur de pensées...