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?

Respuestas:


244

Lo que publicaste debería funcionar perfectamente:

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

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

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

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"

17

¿Hay alguna forma de acceder Foo::CONSTANT_NAME?

Sí hay:

Foo::CONSTANT_NAME

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.