【问题标题】:How do I write a complex multi-line if condition in Ruby?如何在 Ruby 中编写复杂的多行 if 条件?
【发布时间】: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;
}

【问题讨论】:

    标签: ruby if-statement conditional conditional-statements


    【解决方案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 语句时找出它在做什么。
    • 我也更喜欢在以问号结尾的自记录方法中提取甚至稍微复杂的布尔检查。提高理智。
    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 2018-04-10
    • 2014-12-15
    • 2021-12-06
    • 2011-12-23
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多