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).