如何在Ruby中编写这个多行,复杂的if语句?
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;
}
答案 0 :(得分:76)
简短的回答是操作符需要位于行的末尾,以便告诉Ruby继续读取下一行作为语句的一部分,这样就可以了:
if ( (aa != nil && self.prop1 == aa.decrypt) ||
(bb != nil && self.prop2 == bb.decrypt) ) &&
(self.id.nil? || self.id != id)
return true
end
话虽这么说,你可以通过基于输入值抛出异常来减少逻辑,并删除一些冗余检查(我在这里做一些关于你的变量会是什么样子的跳转,但是你明白了。)< / p>
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
答案 1 :(得分:18)
你需要使用反斜杠字符来转义空格,它很丑,但如果你想将条件分成多行,你需要它。或者将布尔运算符保留在前一行上。因此,其中任何一个都可行:
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