Acessando constantes de uma classe


142

Quando eu tenho o seguinte:

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

  ...
end

Existe uma maneira de acessar Foo::CONSTANT_NAMEou preciso criar um método de classe para acessar o valor?

Respostas:


244

O que você postou deve funcionar perfeitamente:

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

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

2
Hmm, eu devo ter digitado errado quando testei anteriormente. Ooops :)
Jeremy Smith

12
para que isso seja realmente uma constante, não se esqueça de adicionar um .gelo no final do valor! CONSTANT_NAME = ["a", "b", "c"].freeze
Mutexkid

6
Sempre misturar ::e .;)
Nick

As coisas são difíceis de detectar quando uppercased;)
Michael Yin

42

Se você estiver escrevendo um código adicional em sua classe que contenha a constante, poderá tratá-lo como um global.

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

Se você estiver acessando a constante fora da classe, prefixe-a com o nome da classe, seguido por dois pontos

Foo::MY_CONSTANT  #=> hello

42

Algumas 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

Existe uma maneira de acessar Foo::CONSTANT_NAME?

Sim existe:

Foo::CONSTANT_NAME

Quando estou tentando acessá-lo, estou tendo um aviso abaixo. aviso: constante já inicializada TestData :: CONSTANT_VAR Essa variável não é inicializada em nenhum outro lugar. Por que estou tendo esse aviso?
ASM
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.