Різниця між "не" і "!" В рубіні


Відповіді:


143

Вони майже синоніми, але не зовсім. Різниця полягає в тому, що вони !мають більший пріоритет перед not, як &&і ||є більш високим пріоритетом перед andта or.

!має найвищий пріоритет серед усіх операторів, і notодин з найнижчих, ви можете знайти повну таблицю в документах Ruby .

Як приклад розглянемо:

!true && false
=> false

not true && false
=> true

У першому прикладі !є найвищий пріоритет, тому ви ефективно говорите false && false.
У другому прикладі notє нижчий пріоритет ніж true && false, тому це "переключилося" falseз " true && falseна" true.

Загальна інструкція, здається, повинна дотримуватися !, якщо у вас немає конкретних причин для використання not. !в Рубі поводиться так само, як і в більшості інших мов, і "менш дивно", ніж not.


6
Раніше я використовував "не", щоб полегшити читання заперечених умов. Тобто, якщо цілість умовного слід заперечити, я почував себе комфортно, використовуючи "не", а не "!". Мені подобається, коли мій код читає як inglush
jaydel

@jaydel Чи можете ви використати unlessв цьому випадку?
Яків

1
@Jacob, так, безумовно. unlessпросто не дуже прихильний у рубіновому світі. Загальний консенсус полягає в тому, що він просто заважає, коли !працює так само добре в більшості ситуацій. Я впевнений, що є випадки, коли хіба що це може бути виразніше, але я чітко розуміюсь.
Бренан

4
Я не погоджуюсь, що unlessце недобросовісно. Найближче до консенсусу говорить інакше.
Адам Лассек

1
Просто хотів поділитися прикладом того, як дивно notможе бути. У Python я іноді присвоюю булеві змінні, щоб полегшити читання тверджень if-заяви. Це може означати використання шаблону x = not y, де y - щось складне. У Рубі x = !yпрацює, але x = not yпотрапляє syntax error, unexpected tIDENTIFIER, expecting '('. Порядок старшинства означає , що це необхідно в круглих дужках праворуч від цітого призначення до роботи: x = (not y).
С. Кірбі

13

Простий спосіб зрозуміти notоператора - це дивитися на not true && falseйого рівнозначне!(true && false)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.