Как написать сложное многострочное условие if в Ruby?
Как написать это многострочное сложное условие if в Ruby?
if ( (aa != nil && self.prop1 == aa.decrypt)
|| (bb != nil && self.prop2 == bb.decrypt)
) && (self.id.nil? || self.id != id)
return true
end
Я получаю Syntax error; unexpected tOROP
.
В Java я мог написать
if (
( (aa != null && aa.prop1.equals(aa.decrypt()))
|| (bb != null && bb.prop2.equals(bb.decrypt()))
)
&& (this.id != id)
) {
return true;
}
Ответы
Ответ 1
Короткий ответ заключается в том, что оператор должен находиться в конце строки, чтобы сообщить Ruby продолжить чтение следующей строки как часть инструкции, так что это будет работать:
if ( (aa != nil && self.prop1 == aa.decrypt) ||
(bb != nil && self.prop2 == bb.decrypt) ) &&
(self.id.nil? || self.id != id)
return true
end
Как вы говорите, вы, вероятно, можете уменьшить логику, выбросив исключения на основе входных значений и удалив некоторые избыточные проверки (я делаю некоторые прыжки здесь о том, как будут выглядеть ваши переменные, но вы получите эту идею.)
raise 'aa must support decrypt' unless aa.respond_to? :decrypt
raise 'bb must support decrypt' unless bb.respond_to? :decrypt
if prop1 == aa.decrypt || prop2 == bb.decrypt
if self.id != id
return true
end
end
Ответ 2
Вам нужно избегать пробелов с символом обратной косой черты, это уродливо, но вам это нужно, если вы хотите разделить условия на несколько строк. Либо это, либо оставить логический оператор в предыдущей строке. Поэтому любой из них будет работать:
if ( (aa != nil && self.prop1 == aa.decrypt)\
|| (bb != nil && self.prop2 == bb.decrypt)\
) && (self.id.nil? || self.id != id)
return true
end
или
if ( (aa != nil && self.prop1 == aa.decrypt) ||
(bb != nil && self.prop2 == bb.decrypt)) &&
(self.id.nil? || self.id != id)
return true
end
Лично я обычно решаю поставить все или все условия в методе, который сам документирует то, что решено:
def everythings_cool?
( (aa != nil && self.prop1 == aa.decrypt) ||
(bb != nil && self.prop2 == bb.decrypt)) &&
(self.id.nil? || self.id != id)
end
то
if everythings_cool?
# do stuff