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


145

Когда у меня есть следующее:

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

  ...
end

Есть ли способ получить доступ Foo::CONSTANT_NAMEили мне нужно создать метод класса для доступа к значению?

Ответы:


248

То, что вы опубликовали, должно работать отлично:

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

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

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

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

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 Эта переменная больше нигде не инициализируется. Почему у меня появляется это предупреждение?
Saikat
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.