Nil || false и false || ноль в рубине

nil || false возвращает false и false || nil возвращает nil. У кого-нибудь есть объяснение?

Ответ 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).