如何在Ruby中编写复杂的多行if条件?

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)

  • 我也更喜欢在以问号结尾的自我记录方法中提取甚至非常复杂的布尔检查.改善理智. (2认同)