Accediendo a las constantes de una clase

142

Cuando tengo lo siguiente:

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

  ...
end

¿Hay alguna manera de acceder Foo::CONSTANT_NAMEo tengo que hacer un método de clase para acceder al valor?

Jeremy Smith
fuente

Respuestas:

244

Lo que publicaste debería funcionar perfectamente:

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

Foo::CONSTANT_NAME
# => ["a", "b", "c"]
Dylan Markow
fuente
2
Hmm, debo haber escrito mal cuando probé antes. Ooops :)
Jeremy Smith
12
para que esto sea realmente una constante, ¡no olvides agregar un .freeze al final del valor! CONSTANT_NAME = ["a", "b", "c"].freeze
mutexkid
66
Siempre mezcle ::y .;)
Nick
Las cosas son difíciles de detectar cuando están en mayúsculas;)
Michael Yin
42

Si está escribiendo código adicional dentro de su clase que contiene la constante, puede tratarlo como un global.

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

Si está accediendo a la constante fuera de la clase, agregue el prefijo con el nombre de la clase, seguido de dos puntos

Foo::MY_CONSTANT  #=> hello
maček
fuente
42

Algunas alternativas:

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
fuente
17

¿Hay alguna forma de acceder Foo::CONSTANT_NAME?

Sí hay:

Foo::CONSTANT_NAME
Jörg W Mittag
fuente
Cuando intento acceder a él, aparece la siguiente advertencia. advertencia: constante inicializada TestData :: CONSTANT_VAR Esta variable no se inicializa en ningún otro lugar. ¿Por qué estoy teniendo esta advertencia?
ASM