Есть ли мудрость за "и", "или" операторами в Ruby? - PullRequest
10 голосов
/ 16 сентября 2009

Интересно, почему ruby ​​дает and, or меньший приоритет, чем &&, ||, и оператор присвоения? Есть ли причина?

Ответы [ 5 ]

15 голосов
/ 17 сентября 2009

Полагаю, это прямой переход от 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"

Если вы используете ||, это будет синтаксическая ошибка.

8 голосов
/ 17 сентября 2009

Разница в приоритете. ||, && имеют более высокий приоритет, чем =, но and, or имеют более низкий приоритет. Так что пока можно сделать:

a = nil || 0

Вы должны сделать:

a = (nil or 0)

чтобы получить тот же эффект. Если вы делаете:

a = nil or 0

Результатом выражения по-прежнему будет 0, но значением будет ноль.

5 голосов
/ 16 сентября 2009

У них очень низкий приоритет, поэтому операнды не нужно заключать в скобки, как это иногда бывает с && и ||.

4 голосов
/ 16 сентября 2009

Возможность контролировать приоритет ваших операторов иногда полезна, особенно если вас интересует удобочитаемость - дополнительные скобки в условных выражениях иногда могут скрыть реальную логику.

Честно говоря, я думаю, что причина того, что у Ruby есть уровни приоритета булевых операторов, связана с тем, что Матц был программистом на Perl еще до того, как написал Ruby, и позаимствовал большую часть основного синтаксиса и операторов из этого. язык.

2 голосов
/ 17 сентября 2009

Я полагаю, что идея состоит в том, чтобы сделать их ниже операторов присваивания, чтобы вы могли писать логические тесты с присваиваниями, но без символов.

...