Constantes ou variables de classe dans ruby?

je programmais à Ruby depuis quelques mois maintenant, et je me demande quand il est approprié d'utiliser les constantes sur les variables de classe et vice versa. (Je travaille dans les Rails, je pense aux constantes dans les modèles).

class Category
  TYPES = %w(listing event business).freeze
end

ou

class Category
  @@types = %w(listing event business).freeze
  cattr_reader :types
end

existe t-il des circonstances où l'un est préférable à l'autre? Ou est-ce juste une question de goût/style?

45
demandé sur Andrew Grimm 2008-12-23 01:16:34

5 réponses

l'essentiel est qu'en utilisant la notation constante, vous le faites comprendre au lecteur. le cas inférieur, chaîne gelée donne l'impression est pourrait être réglable, forçant quelqu'un à revenir en arrière et lire le RDoc.

55
répondu Charlie Martin 2008-12-22 22:31:01

si ce sont vraiment des valeurs constantes que vous définissez dans le code source et que vous ne voulez pas changer pendant l'exécution du code, alors je recommande d'utiliser constant.

si vous prévoyez de définir et/ou de modifier ces valeurs de manière dynamique pendant l'exécution, utilisez la variable de classe avec getters et setters.

10
répondu Raimonds Simanovskis 2008-12-22 22:37:43

en gros, vous pouvez le mettre comme ceci: si vous voulez quelque chose qui est constant, utilisez une constante. Si vous voulez quelque chose qui est variable, utilisez une variable. Il semble que votre liste de types sont des constantes, car c'est une gelée de tableau, donc je dirais que c'est logique d'utiliser une constante dans ce cas.

8
répondu August Lilleaas 2008-12-25 10:10:24

si vous ne voulez pas que la valeur change pendant l'exécution de votre programme, et vous êtes à l'aise de permettre l'accès à la valeur en dehors de votre classe, utilisez une constante.

Sinon, vous pouvez utiliser une variable de classe. Cependant, sachez que les variables de classe sont partagées entre les sous-classes et les instances de sous-classes. Donc, si vous pouvez à un moment donné dans le futur mettre en œuvre une classe d'enfant, vous devez être très prudent sur votre utilisation des variables de classe.

référez-vous aux réponses ici pour plus sur ce: variables de classe dans Ruby

1
répondu awolfson 2017-05-23 12:01:46

si vous voulez rendre votre vie privée constante, vous pouvez toujours faire:

FOO = 18
private_constant :FOO
0
répondu berkos 2018-09-28 16:05:04