Jak mogę sprawdzić, czy zmienna jest zdefiniowana w Ruby? Czy dostępna jest isset
metoda typu?
ruby
reflection
Tylko czytać
źródło
źródło
nil
jest inicjalizowana.||=
operatora) poniżej.defined?
nadal zwraca wartość true dla zmiennej zdefiniowanej w tym bloku!defined?
która zwraca wartość logiczną?!!defined?(object_name)
Jest to przydatne, jeśli nie chcesz nic robić, jeśli istnieje, ale utwórz go, jeśli nie istnieje.
To tworzy nową instancję tylko raz. Potem po prostu zwraca var.
źródło
||=
wartości boolowskich, aby nie poczuć bólu pomieszania.nil
chyba że naprawdę chcesz oceniać wyrażenie za każdym razem, gdy jest wywoływane, gdy ono powracanil
var = (var or var.nil?)
Prawidłowa składnia powyższej instrukcji to:
podstawiając (
var
) swoją zmienną. Ta składnia zwróci wartość prawda / fałsz do oceny w instrukcji if.źródło
defined?(var) == nil
?.nil?
jest bardziej idiomatyczne, jak mówią. Bardziej „obiektowo” jest pytać obiekt, czy jestnil
to operator niż porównywanie. Żadna z tych rzeczy nie jest trudna do odczytania, więc użyj którejkolwiek, która pomoże Ci wysłać więcej produktów.defined?(your_var)
będzie działać. W zależności od tego, co robisz, możesz także zrobić coś takiegoyour_var.nil?
źródło
your_var.nil?
ponieważ zwraca wartość prawda fałszu i jest o wiele ładniejszy do odczytu i zapisu niżdefined? var
. Dzięki za to.your_var.nil?
spowoduje błąd:undefined local variable or method your_var
jeśli nie zdefiniowano wcześniej ...Spróbuj „chyba” zamiast „jeśli”
źródło
Użyj
defined? YourVariable
Keep it simple głupie ..;)
źródło
Oto kod, nic, nauka rakietowa, ale działa wystarczająco dobrze
Oczywiście kod kolorowania nie jest konieczny, tylko ładna wizualizacja w tym przykładzie zabawki.
źródło
nil?
jest opcjonalny.OSTRZEŻENIE Re: Wspólny wzór rubinowy
Oto kluczowa odpowiedź:
defined?
metoda. Powyższa odpowiedź doskonale to ilustruje.Ale pod falami czai się rekin ...
Rozważ ten typ wspólnego wzoru rubinowego:
method2
zawsze wracanil
. Gdy po raz pierwszy nazywająmethod1
The@x
zmienna nie jest ustawiona - zatemmethod2
będą działać. imethod2
ustawi@x
nanil
. W porządku, a wszystko dobrze i dobrze. Ale co się stanie, kiedy zadzwonisz po raz drugimethod1
?Pamiętaj, że @x zostało już ustawione na zero.
But method2
nadal będzie uruchamiany ponownie !! Jeśli metoda 2 jest kosztownym przedsięwzięciem, może nie być to coś, czego chcesz.Niech
defined?
metoda przyjdzie na ratunek - dzięki temu rozwiązaniu, że konkretny przypadek jest obsługiwany - użyj następujących poleceń:Diabeł tkwi w szczegółach: ale tą
defined?
metodą możesz uniknąć tego czającego się rekina .źródło
Możesz spróbować:
Ponieważ zwraca wartość logiczną.
źródło
SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
unless
oświadczenia wydaje się zbyt skomplikowanePonieważ wiele innych przykładów pokazuje, że tak naprawdę nie potrzebujesz logicznej metody, aby dokonać logicznych wyborów w Rubim. Byłoby kiepską formą przymuszanie wszystkiego do wartości logicznej, chyba że faktycznie potrzebujesz wartości logicznej.
Ale jeśli absolutnie potrzebujesz wartości logicznej. Posługiwać się !! (Bang Bang) lub „Falsy Falsy ujawnia prawdę”.
Dlaczego zwykle nie opłaca się wymuszać:
Oto przykład, w którym ma to znaczenie, ponieważ opiera się na domniemanym przymusie wartości logicznej do jego reprezentacji ciągu.
źródło
Należy wspomnieć, że użycie
defined
do sprawdzenia, czy określone pole w haszowaniu może zachowywać się nieoczekiwanie:Składnia jest tutaj poprawna, ale
defined? var['unknown']
zostanie przetworzona na ciąg znaków"method"
, więcif
blok zostanie wykonanyedytuj: Poprawnym zapisem do sprawdzania, czy klucz istnieje w haszowaniu byłoby:
źródło
Zwróć uwagę na rozróżnienie między „zdefiniowanym” a „przypisanym”.
x jest zdefiniowane, nawet jeśli nigdy nie jest przypisane!
źródło
NameError Exception: undefined local variable or method
i byłem zdezorientowany, gdy jedynym przypisaniem / wzmianką o zmiennej był blok if, który nie został trafiony.Możesz również sprawdzić, czy jest zdefiniowany w ciągu znaków za pomocą interpolacji, jeśli kodujesz:
System poinformuje o typie, jeśli jest zdefiniowany. Jeśli nie zostanie zdefiniowane, zwróci tylko ostrzeżenie, że zmienna nie została zainicjowana.
Mam nadzieję że to pomoże! :)
źródło
defined?
jest świetny, ale jeśli jesteś w środowisku Railsów, możesz również użyćtry
, szczególnie w przypadkach, gdy chcesz sprawdzić nazwę zmiennej dynamicznej:źródło