2012-10-03 15 views
11

nil || false zwraca false i false || nil zwraca nil. Czy ktoś ma wyjaśnienie tego?zero || false i false || zero w Ruby

+0

W przypadku punktów bonusowych wyjaśnij, dlaczego 'nil || false i false || nil' ocenia fałszywe – pguardiario

+0

@pguardiario http://stackoverflow.com/questions/1840488/operator-precedence-for-and-in-ruby – x1a4

Odpowiedz

16

W języku Ruby wszystko jest wyrażeniem, a wyrażenie zwróci ostatnią wartość w nim ocenianą.

Dla obu przykładów po lewej stronie wyrażenia || jest obliczana wartość fałszerstwa, więc Ruby następnie ocenia prawą stronę i zwraca ją.

+0

Twoje wyjaśnienie jest bardzo jasne, dzięki! – user1538814

3

|| zwraca wynik ostatniego wyrażonego wyrażenia. Jeśli oceni LHS i znajdzie wartość true, otrzymasz LHS; w przeciwnym razie otrzymasz RHS (bez względu na to, co może być RHS).

+0

To było naprawdę dobre wyjaśnienie, dziękuję! – user1538814

4

Jak podkreślono w innych, || najpierw ocenia wyrażenie po lewej. Jeśli jest "prawdziwy" (cokolwiek z wyjątkiem false lub nil), zwraca to. W przeciwnym razie oblicza wyrażenie po prawej stronie i zwraca je (bez względu na to, co to jest).

Dzięki temu || przyda się znacznie więcej niż tylko testy boolowskie. Na przykład, po prostu użył go na drugi dzień podczas pisania kodu dla chronic gem:

@now = options[:now] || Chronic.time_class.now 

Oznacza to, że: „jeśli options hash zawiera wartość :now, sklepu, który w @now przeciwnym razie spadnie z powrotem na Chronic.time_class.now. jako domyślny ". Jestem pewien, że możesz wymyślić wiele możliwych aplikacji w swoich własnych programach.

&& jest analogiczna: najpierw oblicza wyrażenie po lewej stronie, a jeśli ocenia się false lub nil, że wraca. W przeciwnym razie oblicza wyrażenie po prawej stronie i zwraca je (bez względu na to, co to jest).

Oznacza to && jest również przydatna dla dużo więcej niż tylko badań logicznych. Możesz go użyć do wyciśnięcia dwóch linii kodu w jeden. Na przykład:

do_something && do_something_else 

(To działa tylko jeśli wiesz, że wartość zwracana do_something nigdy nie będzie false lub nil!)

Można również użyć && wycisnąć „osłona” wypowiedzi na ten sam linia jak to, co jest "strzeże":

message && send_message(message) 

które mogłyby zastąpić:

unless message.nil? 
    send_message(message) 
end 
+0

Nadal uczę się ruby, ale to jest naprawdę pomocne. – user1538814