Accéder aux constantes d'une classe


142

Lorsque j'ai ce qui suit:

class Foo
   CONSTANT_NAME = ["a", "b", "c"]

  ...
end

Existe-t-il un moyen d'accéder avec Foo::CONSTANT_NAMEou dois-je créer une méthode de classe pour accéder à la valeur?

Réponses:


244

Ce que vous avez publié devrait fonctionner parfaitement:

class Foo
  CONSTANT_NAME = ["a", "b", "c"]
end

Foo::CONSTANT_NAME
# => ["a", "b", "c"]

2
Hmm, je dois avoir mal tapé quand j'ai testé plus tôt. Ooops :)
Jeremy Smith

12
pour que cela soit vraiment une constante, n'oubliez pas d'ajouter un .freeze à la fin de la valeur! CONSTANT_NAME = ["a", "b", "c"].freeze
mutexkid

6
Toujours mélanger ::et .;)
Nick

Les choses sont difficiles à repérer lorsqu'elles sont en majuscules;)
Michael Yin

42

Si vous écrivez du code supplémentaire dans votre classe qui contient la constante, vous pouvez le traiter comme un global.

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

Si vous accédez à la constante en dehors de la classe, préfixez-la avec le nom de la classe, suivi de deux deux points

Foo::MY_CONSTANT  #=> hello

42

Quelques alternatives:

class Foo
  MY_CONSTANT = "hello"
end

Foo::MY_CONSTANT
# => "hello"

Foo.const_get :MY_CONSTANT
# => "hello"

x = Foo.new
x.class::MY_CONSTANT
# => "hello"

x.class.const_defined? :MY_CONSTANT
# => true

x.class.const_get :MY_CONSTANT
# => "hello"

17

Y a-t-il un moyen d'y accéder Foo::CONSTANT_NAME?

Oui il y a:

Foo::CONSTANT_NAME

Lorsque j'essaie d'y accéder, je reçois un avertissement ci-dessous. avertissement: constante déjà initialisée TestData :: CONSTANT_VAR Cette variable n'est initialisée nulle part ailleurs. Pourquoi ai-je cet avertissement?
ASM
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.