nil || false возвращает false и false || nil возвращает nil. У кого-нибудь есть объяснение?
Nil || false и false || ноль в рубине
Ответ 1
В Ruby все это выражение, и выражение вернет последнее значение, оцениваемое внутри него.
В обоих примерах левая часть выражения || оценивается как ложное значение, поэтому Ruby затем оценивает правую часть и возвращает ее.
Ответ 2
Как отмечали другие, || сначала оценивает выражение слева. Если оно "истинно" (ничего, кроме false или nil), оно возвращает это. В противном случае он оценивает выражение справа и возвращает его (независимо от того, что это такое).
Это делает || полезным гораздо больше, чем просто логические тесты. Например, я просто использовал его на днях, когда писал код для chronic gem:
@now = options[:now] || Chronic.time_class.now
Это означает: "если хэш options содержит значение :now, сохраните его в @now. В противном случае оставьте на Chronic.time_class.now по умолчанию". Я уверен, что вы можете думать о множестве возможных приложений в своих программах.
&& аналогичен: он сначала оценивает выражение слева, и если он оценивает значение false или nil, он возвращает это. В противном случае он оценивает выражение справа и возвращает его (независимо от того, что это такое).
Это означает, что && также полезен для гораздо большего, чем просто логические тесты. Вы можете использовать его, чтобы сжать две строки кода в один. Например:
do_something && do_something_else
(Это работает, только если вы знаете, что возвращаемое значение do_something никогда не будет false или nil!)
Вы также можете использовать &&, чтобы сжать выражение "guard" в той же строке, что и "защита":
message && send_message(message)
Что может заменить:
unless message.nil?
send_message(message)
end
Ответ 3
|| возвращает результат последнего оцениваемого выражения. Если он оценивает LHS и находит значение true, вы получаете LHS; в противном случае вы получаете RHS (независимо от того, что может быть RHS).