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)

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.


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


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.


:) 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.