Проверить, определена ли уже константа

82

Надеюсь, это простой. Как в следующем примере проверить, определена ли уже константа?

#this works
var = var||1
puts var
var = var||2
puts var

#this doesn't
CONST = CONST||1
puts CONST
CONST = CONST||2
puts CONST

=> 1
   1
   uninitialized constant CONST (NameError)
Питер
источник

Ответы:

133
CONST = 2 unless defined? CONST

Смотрите здесь больше об удивительном defined?операторе.

PS А в будущем, думаю, вы захотите var ||= 1вместо var = var||1.

джибиэль
источник
6
Также есть, const_defined?но для меня это не работает; не знаю почему.
Джаред Бек
8
const_defined?- это метод Moduleкласса, и он сообщит вам, определена ли константа в этом модуле и его предках (необязательно). Посмотрите документы для некоторых примеров - ruby-doc.org/core-1.9.3/Module.html#method-i-const_defined-3F
jibiel
А что насчет этого? ruby-doc.org/core-1.9.3/Module.html#method-i-const_defined-3F
Донато
Спасибо за этот ответ .. отличный обходной путь для невозможности использовать || = надежно с логическим значением
Чак ван дер Линден
Это также отлично подходит для методов, а не только для констант.
Джошуа Пинтер
25

const_defined? API

pry> User.const_defined?("PER_PAGE")
=> true
pry> User.const_defined?("PER_PAGE123")
=> false
Rusllonrails
источник
1
Это особенно полезно, когда вы проверяете, определено ли это динамически.
DickieBoy
4
CONST ||= :default_value

вышеупомянутое работает для меня на Ruby 1.9.3, но не работает на 1.8 ... ну, 1.8 теперь устарел.

Акостадинов
источник
:) 1.8 может быть древним, но все еще используется в 2017 году, например: виртуальный хостинг Dreamhost.
Манит
Я вижу, что большинство проектов уже отказались от поддержки ruby ​​1.8. Я знаю, что все еще существуют «поддерживаемые» версии ruby ​​1.8, например, поставляемые Red Hat Enterprise Linux. Они получают исправления безопасности, но один из них обнаруживает множество неизвестных недостатков безопасности в старых версиях гемов, используемых в любом установленном приложении. Так что да, есть, но для большинства людей это не имеет значения. Вроде есть и будут еще долго компьютеры под управлением XP (совсем недавно снова заметил такой банкомат).
akostadinov