Я помню, что где-то читал, что 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).