Я имею если оператор в моем приложении для направляющих. Я должен сделать основное "если верный и! ложный" вид проверки. Выражение определяется как:
ActiveRecord::Base.connection.tables.include? 'settings' && !Settings.setting_is_set?('defaults_set')
Если я поместил это как свое выражение к, если, если не инициирует. Если я выполняю то выражение в консоли, я получаю ложь.
Теперь, если я изменяю выражение для чтения:
ActiveRecord::Base.connection.tables.include? 'settings' and not Settings.setting_is_set?('defaults_set')
Это возвращает true, как это должно, и выполнение, это - блок.
Таким образом, вопрос: Почему 'выражение &&! выражение', не ведущее себя как 'выражение и не выражение'. Это - мое понимание && и! должен соответствовать и и не почти непосредственно.
Что я пропускаю здесь?
Это потому, что когда вы используете &&
, Ruby интерпретирует весь конец строки как один аргумент, передаваемый в , включая
. Поместите круглые скобки в «настройки»
, и первый оператор будет работать нормально:
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
Каким-то образом, когда вы используете , а не
, он знает, что вторая часть не является частью того, что сейчас передается на include
, и ваш вызов завершается успешно.