operator - ¿Cómo escribo una compleja condición multilínea en Ruby?
ruby selenium if else (2)
Debe escapar del espacio en blanco con la barra diagonal inversa, es feo pero lo necesita si desea dividir las condiciones en varias líneas. O eso o deja el operador booleano en la línea anterior. Entonces cualquiera de estos funcionará:
if ( (aa != nil && self.prop1 == aa.decrypt)/
|| (bb != nil && self.prop2 == bb.decrypt)/
) && (self.id.nil? || self.id != id)
return true
end
o:
if ( (aa != nil && self.prop1 == aa.decrypt) ||
(bb != nil && self.prop2 == bb.decrypt)) &&
(self.id.nil? || self.id != id)
return true
end
Personalmente, por lo general, decido poner todas o cada una de las condiciones en un método que documenta por sí mismo lo que se está decidiendo:
def everythings_cool?
( (aa != nil && self.prop1 == aa.decrypt) ||
(bb != nil && self.prop2 == bb.decrypt)) &&
(self.id.nil? || self.id != id)
end
entonces:
if everythings_cool?
# do stuff
¿Cómo escribo esta declaración de condición compleja multi-línea en Ruby?
if ( (aa != nil && self.prop1 == aa.decrypt)
|| (bb != nil && self.prop2 == bb.decrypt)
) && (self.id.nil? || self.id != id)
return true
end
Estoy obteniendo un Syntax error; unexpected tOROP
Syntax error; unexpected tOROP
.
En Java, podría escribir
if (
( (aa != null && aa.prop1.equals(aa.decrypt()))
|| (bb != null && bb.prop2.equals(bb.decrypt()))
)
&& (this.id != id)
) {
return true;
}
La respuesta corta es que el operador debe estar al final de la línea para decirle a Ruby que continúe leyendo la siguiente línea como parte de la declaración, así que esto funcionaría:
if ( (aa != nil && self.prop1 == aa.decrypt) ||
(bb != nil && self.prop2 == bb.decrypt) ) &&
(self.id.nil? || self.id != id)
return true
end
Dicho esto, probablemente puedas reducir la lógica lanzando excepciones basadas en valores de entrada y eliminando algunas comprobaciones redundantes (estoy haciendo algunos saltos aquí sobre cómo se verán tus variables, pero entiendes la idea).
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