Как написать сложное многострочное условие 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;
}
2 ответов
короткий ответ заключается в том, что оператор должен быть в конце строки, чтобы сказать 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
вам нужно избежать пробелов с символом обратной косой черты, это уродливо, но вам это нужно, если вы хотите разделить условия на несколько строк. Либо это, либо оставьте логический оператор в предыдущей строке. Так что любой из них будет работать:
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