Chl*_*loe 47 ruby conditional if-statement conditional-statements
如何在Ruby中编写这个多行,复杂的if语句?
if ( (aa != nil && self.prop1 == aa.decrypt)
|| (bb != nil && self.prop2 == bb.decrypt)
) && (self.id.nil? || self.id != id)
return true
end
Run Code Online (Sandbox Code Playgroud)
我到了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;
}
Run Code Online (Sandbox Code Playgroud)
Kyl*_*ith 77
简短的回答是操作符需要在行的末尾,以告诉Ruby继续读取下一行作为语句的一部分,所以这将工作:
if ( (aa != nil && self.prop1 == aa.decrypt) ||
(bb != nil && self.prop2 == bb.decrypt) ) &&
(self.id.nil? || self.id != id)
return true
end
Run Code Online (Sandbox Code Playgroud)
话虽这么说,你可以通过基于输入值抛出异常并删除一些冗余检查来减少逻辑(我在这里做一些关于你的变量看起来像什么的跳转,但你明白了.)
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
Run Code Online (Sandbox Code Playgroud)
Die*_*zar 18
你需要用反斜杠字符来转义空格,它很难看,但如果你想将条件分成多行,你需要它.或者将布尔运算符保留在前一行上.所以这些都可以工作:
if ( (aa != nil && self.prop1 == aa.decrypt)\
|| (bb != nil && self.prop2 == bb.decrypt)\
) && (self.id.nil? || self.id != id)
return true
end
Run Code Online (Sandbox Code Playgroud)
要么:
if ( (aa != nil && self.prop1 == aa.decrypt) ||
(bb != nil && self.prop2 == bb.decrypt)) &&
(self.id.nil? || self.id != id)
return true
end
Run Code Online (Sandbox Code Playgroud)
就个人而言,我通常决定将每个或所有条件放在一个自我记录所决定的方法中:
def everythings_cool?
( (aa != nil && self.prop1 == aa.decrypt) ||
(bb != nil && self.prop2 == bb.decrypt)) &&
(self.id.nil? || self.id != id)
end
Run Code Online (Sandbox Code Playgroud)
然后:
if everythings_cool?
# do stuff
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
46766 次 |
| 最近记录: |