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