Разница между `not` и`! `В рубине

Ответы:

143

Они почти синонимы, но не совсем. Разница заключается в том, что !имеет более высокий приоритет , чем not, так же, как &&и ||имеют более высокий приоритет , чем andи or.

!имеет самый высокий приоритет среди всех операторов и notодин из самых низких, вы можете найти полную таблицу в документации Ruby .

В качестве примера рассмотрим:

!true && false
=> false

not true && false
=> true

В первом примере !имеет наивысший приоритет, так что вы фактически говорите false && false.
Во втором примере notимеет более низкий приоритет, чем true && false, поэтому он "переключил" falseс true && falseна true.

Похоже, что вы должны придерживаться общего правила !, если у вас нет особой причины использовать not. !в Ruby ведет себя так же, как и большинство других языков, и «менее удивителен», чем not.

Бреннан
источник
6
В прошлом я использовал «не», чтобы упростить чтение отрицательных условных выражений. Это означает, что если все условное выражение должно быть отвергнуто, я чувствовал себя комфортно, используя «не», а не «!». Мне нравится, когда мой код читается как inglush
jaydel
@jaydel Не могли бы вы использовать unlessв таком случае?
Джейкоб
1
@ Джейкоб, да, определенно. unlessпросто не очень популярны в мире рубинов. По общему мнению, это просто мешает, когда !работает так же хорошо в большинстве ситуаций. Я уверен, что есть случаи, когда разве может быть более выразительным, но я держусь подальше.
Бреннан
4
Я не согласен с тем, что unlessне нравится. Самое близкое к консенсусу утверждение говорит об обратном.
Адам Лассек
1
Просто хотел поделиться примером того, насколько удивительным notможет быть. В Python я иногда назначаю переменным логические значения, чтобы облегчить чтение операторов if. Это может означать использование шаблона x = not y, где y - что-то сложное. В Ruby x = !yработает, но x = not yзаводится syntax error, unexpected tIDENTIFIER, expecting '('. Порядок старшинства означает , что это необходимо в круглых скобках справа от цитого назначения к работе: x = (not y).
С. Кирби
13

Простой способ понять notоператор - рассматривать его not true && falseкак эквивалент!(true && false)

Рони
источник