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;
}
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
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