Я помню, что где-то читал, что not
и !
оцениваются по-разному, и я не могу найти это в документации. Являются ли они синонимами?
Ответы:
Они почти синонимы, но не совсем. Разница заключается в том, что !
имеет более высокий приоритет , чем not
, так же, как &&
и ||
имеют более высокий приоритет , чем and
и or
.
!
имеет самый высокий приоритет среди всех операторов и not
один из самых низких, вы можете найти полную таблицу в документации Ruby .
В качестве примера рассмотрим:
!true && false
=> false
not true && false
=> true
В первом примере !
имеет наивысший приоритет, так что вы фактически говорите false && false
.
Во втором примере not
имеет более низкий приоритет, чем true && false
, поэтому он "переключил" false
с true && false
на true
.
Похоже, что вы должны придерживаться общего правила !
, если у вас нет особой причины использовать not
. !
в Ruby ведет себя так же, как и большинство других языков, и «менее удивителен», чем not
.
unless
в таком случае?
unless
просто не очень популярны в мире рубинов. По общему мнению, это просто мешает, когда !
работает так же хорошо в большинстве ситуаций. Я уверен, что есть случаи, когда разве может быть более выразительным, но я держусь подальше.
unless
не нравится. Самое близкое к консенсусу утверждение говорит об обратном.
not
может быть. В Python я иногда назначаю переменным логические значения, чтобы облегчить чтение операторов if. Это может означать использование шаблона x = not y
, где y - что-то сложное. В Ruby x = !y
работает, но x = not y
заводится syntax error, unexpected tIDENTIFIER, expecting '('
. Порядок старшинства означает , что это необходимо в круглых скобках справа от цитого назначения к работе: x = (not y)
.