Dostęp do stałych klasy


142

Kiedy mam:

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

  ...
end

Czy istnieje sposób uzyskania dostępu za pomocą Foo::CONSTANT_NAMElub czy muszę utworzyć metodę klasy, aby uzyskać dostęp do wartości?

Odpowiedzi:


244

To, co opublikowałeś, powinno działać idealnie:

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

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

2
Hmm, chyba źle napisałem, kiedy testowałem wcześniej. Ups :)
Jeremy Smith

12
aby to było naprawdę stałe, nie zapomnij dodać .freeze na końcu wartości! CONSTANT_NAME = ["a", "b", "c"].freeze
mutexkid

6
Zawsze mieszaj ::i .;)
Nick

Trudno to zauważyć, gdy są duże;)
Michael Yin

42

Jeśli piszesz dodatkowy kod w swojej klasie, który zawiera stałą, możesz traktować go jak globalny.

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

Jeśli uzyskujesz dostęp do stałej poza klasą, poprzedz ją nazwą klasy, po której następują dwa dwukropki

Foo::MY_CONSTANT  #=> hello

42

Niektóre alternatywy:

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

Czy jest sposób, aby uzyskać dostęp Foo::CONSTANT_NAME?

Tak jest:

Foo::CONSTANT_NAME

Kiedy próbuję uzyskać do niego dostęp, mam poniżej ostrzeżenia. ostrzeżenie: już zainicjowana stała TestData :: CONSTANT_VAR Ta zmienna nie jest inicjowana nigdzie indziej. Dlaczego otrzymuję to ostrzeżenie?
ASM,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.