2010-08-10 6 views

ответ

18

Вы тестируете, являются ли выражения истинными или ложными. Попробуйте следующее:

if (self.expense.nil? == self.income.nil?) 

Вам все равно, являются ли они истинными или оба ложными, только то, что они одинаковы.

+0

Святое дерьмо, я не знал, что у Руби был оператор XOR. Это последний раз, когда я пропускаю скучную серию синтаксиса! ;-) –

+0

@Tom Morris: На самом деле, я думаю, что xor здесь даже не нужно. Проверьте мое обновление! –

+0

Yup. Это лучше в контексте вопроса. Но я все равно благодарен за то, что узнал о XOR-операторе (^). –

0

Вы можете использовать закон де Моргана во второй половине, если условие

так (!self.expense.nil? && !self.income.nil?) становится !(self.expense.nil? || self.income.nil?)

1

Несмотря на логику, так как вы используете, если для проверки нулевой вы могли бы сократить код, как так:

if ((expense && income) || (!expense && !income)) 
    puts "test" 
end 

Исправьте меня, если я ошибаюсь.

+1

Проблема, которая * может возникнуть (в зависимости от возможных значений для переменных), является одной из переменных «false». Затем исходный if-statment возвращает другой результат, чем ваш. Но это нужно учитывать только в том случае, если 'false' является возможным значением для одной из используемых переменных. – Ragmaanir

+0

хорошая точка ... хотя в зависимости от бизнес-логики она все равно может работать нормально – tybro0103

Смежные вопросы