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


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


Спасибо за этот ответ .. отличный обходной путь для невозможности использовать || = надежно с логическим значением
Чак ван дер Линден

Это также отлично подходит для методов, а не только для констант.
Джошуа Пинтер

25

const_defined? API

pry> User.const_defined?("PER_PAGE")
=> true
pry> User.const_defined?("PER_PAGE123")
=> false

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