Перевірте, чи константа вже визначена


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 (зовсім недавно знову помітили такий банкомат).
Акостадінов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.