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