Sprawdź, czy stała jest już zdefiniowana

82

Mam nadzieję, że jest to proste. Jak sprawdzić w poniższym przykładzie, czy stała jest już zdefiniowana?

#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)
Piotr
źródło

Odpowiedzi:

133
CONST = 2 unless defined? CONST

Więcej informacji o niesamowitym operatorze znajdziesz tutajdefined? .

PS I myślę, że w przyszłości będziesz chciał var ||= 1zamiast var = var||1.

jibiel
źródło
6
Jest też, const_defined?ale to nie działa dla mnie; nie pewny dlaczego.
Jared Beck,
8
const_defined?jest metodą Moduleklasy i powie ci, czy stała jest zdefiniowana w tym module i jego przodkach (opcjonalnie). Sprawdź dokumentację, aby zobaczyć kilka przykładów - ruby-doc.org/core-1.9.3/Module.html#method-i-const_defined-3F
jibiel
Dzięki za tę odpowiedź ... świetne obejście problemu z brakiem możliwości użycia || = niezawodnie z wartością logiczną
Chuck van der Linden
Działa to również świetnie w przypadku metod, a nie tylko stałych.
Joshua Pinter
25

const_defined? API

pry> User.const_defined?("PER_PAGE")
=> true
pry> User.const_defined?("PER_PAGE123")
=> false
rusllonrails
źródło
1
Jest to szczególnie przydatne, gdy sprawdzasz, czy jest to zdefiniowane w sposób dynamiczny.
DickieBoy
4
CONST ||= :default_value

powyższe działa u mnie na ruby ​​1.9.3, ale nie działa na 1.8 ... cóż, 1.8 jest teraz starożytny.

akostadinov
źródło
:) 1.8 może być starożytny, ale nadal używany w 2017, przykład: hosting współdzielony Dreamhost.
manitu
Widzę, że większość projektów już porzuciła wsparcie dla Ruby 1.8. Wiem, że nadal istnieją „obsługiwane” wersje Ruby 1.8, np. Dostarczane przez Red Hat Enterprise Linux. Otrzymują łatki bezpieczeństwa, ale jeden naraża się na wiele nieznanych luk w zabezpieczeniach starych wersji klejnotów używanych w dowolnej zainstalowanej aplikacji. Więc tak, jest, ale dla większości ludzi nie ma to znaczenia. Jakby są i będą przez długi czas komputery z systemem XP (dopiero niedawno ponownie zauważyłem taki bankomat).
akostadinov