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

如何在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;
}
2个解决方案
76 votes

简短的答案是,运算符需要位于行的末尾,以告诉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
Kyle Smith answered 2020-06-27T20:13:58Z
18 votes

您需要使用反斜杠字符转义空格,这很丑陋,但是如果要将条件拆分为多行,则需要它。 要么将布尔运算符保留在上一行。 因此,其中任何一个都可以工作:

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
DiegoSalazar answered 2020-06-27T20:14:31Z
translate from https://stackoverflow.com:/questions/21417527/how-do-i-write-a-complex-multi-line-if-condition-in-ruby