Відповіді:
Вони майже синоніми, але не зовсім. Різниця полягає в тому, що вони !
мають більший пріоритет перед 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)
.