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?

Jeremy Smith
la source

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"]
Dylan Markow
la source
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
maček
la source
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"
aidan
la source
17

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

Oui il y a:

Foo::CONSTANT_NAME
Jörg W Mittag
la source
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