如何用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 ( (aa != nil && self.prop1 == aa.decrypt) ||
   (bb != nil && self.prop2 == bb.decrypt) ) &&
   (self.id.nil? || self.id != id)
  return true
end

也就是说,您可能可以通过基于输入值抛出异常,并删除一些冗余判断来减少逻辑(我在这里对变量的外观做了一些 skip ,但您明白了.)

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

Ruby相关问答推荐

Ruby将字符串中的反斜杠替换为双反斜杠

Ruby;人;docs-使用\";?

清理 jruby 中输入数据的编码错误

使用 Ruby,我如何访问和比较这些嵌套的数组值?

Ruby open-uri 重定向被禁止

如何替换 ruby​​ 中模式的每个实例?

Ruby $:.unshift File.dirname(__FILE__)

Faraday中的timeout和open timeout是什么?

检测 ruby​​ 是否在 Windows 上运行的正确方法是什么?

如何在没有 Web 服务器的情况下从命令行执行 ruby​​ 模板文件 (ERB)?

如果浮点组件不是 .00 sprintf/printf,则仅显示小数点

迭代一个数组,一次 n 项

在 Ruby 中重写 to_s 方法不好吗?

在 Rails 中,如何向 String 类添加新方法?

Ruby RVM apt-get 更新错误

条件子句中的赋值是好的Ruby风格吗?

Ruby 将标题发布到 slug

判断是否在 SASS 中定义了变量

对哈希中数组的值求和

Ruby 删除目录