web-dev-qa-db-fra.com

Comment écrire une condition multi-lignes complexe si en Ruby?

Comment écrire cette condition if sur plusieurs lignes et complexe dans Ruby?

  if ( (aa != nil && self.prop1 == aa.decrypt)   
      || (bb != nil && self.prop2 == bb.decrypt)  
    ) && (self.id.nil? || self.id != id) 
    return true
  end

Je suis en train Syntax error; unexpected tOROP.

En Java, je pouvais écrire

if (
     ( (aa != null && aa.prop1.equals(aa.decrypt()))
     || (bb != null && bb.prop2.equals(bb.decrypt()))
     )
     && (this.id != id)
   ) {

   return true;
}
46
Chloe

La réponse courte est que l'opérateur doit être à la fin de la ligne afin de dire Ruby pour continuer à lire la ligne suivante dans le cadre de l'instruction, donc cela fonctionnerait:

if ( (aa != nil && self.prop1 == aa.decrypt) ||
   (bb != nil && self.prop2 == bb.decrypt) ) &&
   (self.id.nil? || self.id != id)
  return true
end

Cela étant dit, vous pouvez probablement réduire la logique en lançant des exceptions basées sur les valeurs d'entrée et en supprimant des vérifications redondantes (je fais quelques sauts ici à quoi ressembleront vos variables, mais vous avez l'idée.)

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
76
Kyle Smith

Vous devez échapper aux espaces avec le caractère barre oblique inverse, c'est moche mais vous en avez besoin si vous voulez diviser les conditions en plusieurs lignes. Soit cela, soit laissez l'opérateur booléen sur la ligne précédente. Donc, l'un ou l'autre fonctionnera:

if ( (aa != nil && self.prop1 == aa.decrypt)\
      || (bb != nil && self.prop2 == bb.decrypt)\
    ) && (self.id.nil? || self.id != id) 
    return true
  end

ou:

if ( (aa != nil && self.prop1 == aa.decrypt) || 
      (bb != nil && self.prop2 == bb.decrypt)) &&
    (self.id.nil? || self.id != id) 
    return true
  end

Personnellement, je décide généralement de mettre chacune ou toutes les conditions dans une méthode qui auto-documente ce qui est décidé:

def everythings_cool?
  ( (aa != nil && self.prop1 == aa.decrypt) || 
          (bb != nil && self.prop2 == bb.decrypt)) &&
        (self.id.nil? || self.id != id) 
end

puis:

if everythings_cool?
  # do stuff
18
DiegoSalazar