Ruby: Почему 'а не' работает, когда '&&! (Expr)' не работает? - PullRequest
5 голосов
/ 12 февраля 2010

В моем приложении Rails есть оператор if. Мне нужно сделать базовую проверку типа «если верно и! Ложь». Выражение определяется как:

ActiveRecord::Base.connection.tables.include? 'settings' && !Settings.setting_is_set?('defaults_set')

Если я выражу это как выражение if, if не сработает. Если я запускаю это выражение в консоли, я получаю false.

Теперь, если я изменю выражение следующим образом:

ActiveRecord::Base.connection.tables.include? 'settings' and not Settings.setting_is_set?('defaults_set')

Возвращает true, как и должно, и выполняет свой блок.

Итак, вопрос в том, почему «выражение &&! Expression» не ведет себя как «выражение и не выражение». Это мое понимание && и! должно соответствовать, а не почти напрямую.

Что мне здесь не хватает?

Ответы [ 2 ]

6 голосов
/ 12 февраля 2010

Это потому, что при использовании && Ruby интерпретирует весь конец строки как один аргумент, передаваемый include. Поставьте круглые скобки вокруг 'settings', и первое выражение будет работать нормально:

ActiveRecord::Base.connection.tables.include? 'settings' && !Settings.setting_is_set?('defaults_set')
# => false

ActiveRecord::Base.connection.tables.include?('settings') && !Settings.setting_is_set?('defaults_set')
# => true

Каким-то образом, когда вы используете and not, он знает, что вторая часть не является частью того, что передается include, и ваш вызов завершается успешно.

1 голос
/ 28 декабря 2016

‘not’ - оператор управления, ! - логический оператор. Разница в том, что «нет» имеет более низкий приоритет при оценке команды. Используйте ! при выполнении логических выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...