Доступ до констант класу


142

Коли у мене є таке:

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

  ...
end

Чи є спосіб отримати доступ до цього Foo::CONSTANT_NAMEчи потрібно зробити метод класу для доступу до значення?

Відповіді:


244

Те, що ви опублікували, має працювати ідеально:

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

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

2
Хм, я, мабуть, неправильно вводив текст, коли я тестував раніше. Ooops :)
Джеремі Сміт

12
щоб це було справді постійною, не забудьте додати .freeze в кінці значення! CONSTANT_NAME = ["a", "b", "c"].freeze
mutexkid

6
Завжди змішуй ::і .;)
Нік

Речі важко помітити, коли їх
Майкл Інь

42

Якщо ви пишете додатковий код у своєму класі, який містить константу, ви можете ставитися до нього як до глобального.

class Foo
  MY_CONSTANT = "hello"

  def bar
    MY_CONSTANT
  end
end

Foo.new.bar #=> hello

Якщо ви отримуєте доступ до константи поза класом, приставте її до назви класу, а потім два двокрапки

Foo::MY_CONSTANT  #=> hello

42

Деякі варіанти:

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

Чи є спосіб отримати доступ Foo::CONSTANT_NAME?

Так, є:

Foo::CONSTANT_NAME

Коли я намагаюся отримати доступ до нього, я маю нижче попередження. попередження: вже ініціалізована константа TestData :: CONSTANT_VAR Ця змінна не ініціалізована більше ніде. Чому я маю це попередження?
ASM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.