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

Posted

技术标签:

【中文标题】如何在 Ruby 中编写复杂的多行 if 条件?【英文标题】:How do I write a complex multi-line if condition in Ruby? 【发布时间】:2014-02-20 10:56:36 【问题描述】:

如何在 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;

【问题讨论】:

【参考方案1】:

简短的回答是操作符需要在行尾,以便告诉 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

【讨论】:

啊!我知道了。那行得通。它实际上处于循环中,因此不想引发异常。 谢谢,这帮助我解决了类似的问题。【参考方案2】:

您需要使用反斜杠字符来转义空格,这很难看,但如果您想将条件拆分为多行,则需要它。要么将布尔运算符留在前一行。所以这两种方法都可以:

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

【讨论】:

我喜欢第二种方式。我不喜欢提取方法,除非它会在多个位置使用,否则你必须将变量传递给它并跟踪它,以便在你回顾 if 语句时找出它在做什么。 我也更喜欢在以问号结尾的自记录方法中提取甚至稍微复杂的布尔检查。提高理智。

以上是关于如何在 Ruby 中编写复杂的多行 if 条件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在多行 if 语句中注释每个条件?

如何使用spring webflux在功能性反应java中编写具有多个if else的复杂代码

如何在 oracle 中将 select 与 if 条件一起用于不同的表,而不是编写函数或存储过程?

Ruby代码美化,多行拆分长指令

如何为csv文件的column2,column 3编写if条件

条件“if”修饰符中的 Ruby 变量赋值