Есть ли какая-то мудрость в использовании операторов «и» и «или» в Ruby?
-
07-07-2019 - |
Вопрос
Интересно, почему рубин дает and
, or
меньший приоритет, чем &&
, ||
и назначить оператор?Есть ли причина?
Решение
Я предполагаю, что это прямой перенос из Perl.Операторы or
и and
были добавлены позже в Perl 5 для особых ситуаций, когда желателен более низкий приоритет.
Например, в Perl мы хотим, чтобы ||
имел более низкий приоритет, поэтому мы могли написать:
try to perform big long hairy complicated action || die ;
и будьте уверены, что ||
не собирался сожрать часть акции.Представлен Perl 5 or
, новая версия ||
который имеет низкий приоритет именно для этой цели.
Пример в Ruby, где вы могли бы использовать or
но нет ||
:
value = possibly_false or raise "foo"
Если вы использовали ||
, это будет синтаксическая ошибка.
Другие советы
Разница в приоритете. ||
, &&
имеют более высокий приоритет, чем =
, но and
, or
есть ниже.Итак, пока вы можете сделать:
a = nil || 0
Вам нужно будет сделать:
a = (nil or 0)
чтобы получить тот же эффект.Если вы это сделаете:
a = nil or 0
Результатом выражения по-прежнему будет 0, но значение будет равно нулю.
Они имеют очень низкий приоритет, поэтому операнды не нужно заключать в круглые скобки, как это иногда бывает с &&
и ||
.
Возможность контролировать приоритет операторов иногда бывает полезна, особенно если вас беспокоит читабельность — дополнительные круглые скобки в условных операторах иногда могут скрыть реальную логику.
Однако, если быть откровенным, я думаю, что причина, по которой Ruby имеет уровни приоритета логических операторов, связана главным образом с тем фактом, что Матц был программистом Perl до того, как написал Ruby, и позаимствовал большую часть основного синтаксиса и операторов из этого языка.
Я считаю, что идея состоит именно в том, чтобы разместить их ниже операторов присваивания, чтобы вы могли писать логические тесты с присваиваниями, но без скобок.