Accesso alle costanti di una classe


142

Quando ho il seguente:

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

  ...
end

C'è un modo per accedere Foo::CONSTANT_NAMEo devo creare un metodo di classe per accedere al valore?

Risposte:


244

Quello che hai pubblicato dovrebbe funzionare perfettamente:

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

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

2
Hmm, devo aver sbagliato a digitare quando ho provato prima. Ooops :)
Jeremy Smith il

12
perché questa sia veramente una costante, non dimenticare di aggiungere un .freeze alla fine del valore! CONSTANT_NAME = ["a", "b", "c"].freeze
mutexkid,

6
Mescolate sempre ::e .;)
Nick,

Le cose sono difficili da individuare se maiuscole;)
Michael Yin,

42

Se stai scrivendo codice aggiuntivo all'interno della tua classe che contiene la costante, puoi trattarlo come un globale.

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

Se accedi alla costante esterna alla classe, aggiungi il prefisso con il nome della classe, seguito da due punti

Foo::MY_CONSTANT  #=> hello

42

Alcune alternative:

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

C'è un modo per accedere Foo::CONSTANT_NAME?

Si C'è:

Foo::CONSTANT_NAME

Quando provo ad accedervi, visualizzo un avviso di seguito. avviso: costante già inizializzata TestData :: CONSTANT_VAR Questa variabile non è inizializzata altrove. Perché sto ricevendo questo avviso?
ASM,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.