Как написать сложное многострочное условие if в Ruby?

Как написать это многострочное, сложное условие if в Ruby?

  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 ответов


короткий ответ заключается в том, что оператор должен быть в конце строки, чтобы сказать 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

вам нужно избежать пробелов с символом обратной косой черты, это уродливо, но вам это нужно, если вы хотите разделить условия на несколько строк. Либо это, либо оставьте логический оператор в предыдущей строке. Так что любой из них будет работать:

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