Cómo combinar dos parámetros de retorno en un solo valor
Lo que tengo muchas veces en diferentes versiones en mi código:
func f() (bool, bool) {
value, successfulOperation := someStuff()
return value, successfulOperation
}
// en otro lugar
value, successfulOperation := f()
if value && successfulOperation {
// hacer algo
}
<p><code>// hacer algo</code> solo debe ejecutarse si <code>value</code> es verdadero Y la operación que obtuvo <code>value</code> se realizó con éxito sin error. En otras palabras: No me importa <code>value</code> ni <code>successfulOperation</code>. Solo me importa <code>value && successfulOperation</code>. </p>
<p><strong>Una solución que quiero evitar (parece verbosa):</strong></p>
<p><code>
value, successfulOperation := f()
actualValue := value && successfulOperation
if actualValue {…}
</code></p>
<p>El código anterior es muy simplificado. En realidad, las condiciones del if estarán anidadas y serán más complicadas. </p>
<p><strong>Lo que quiero:</strong></p>
<p>Un envoltorio para <code>f</code> que combine ambos valores en uno solo. ¿Cómo hago eso? La solución debe funcionar para cualquier función que tome cualquier parámetro y devuelva dos valores booleanos. </p>
<p>Lo siguiente no funciona:</p>
<p>“`
type doubleBoolFunc func(…interface{}) (bool, bool)
func and(fn doubleBoolFunc, params …interface{}) bool {
b1, b2 := fn(params…)
return b1 && b2
}
actualValue := and(f())
“`
davy.ai
Para evitar la redundancia y simplificar el código, puedes definir una función envoltorio que combine los dos valores booleanos de retorno de la función
f
en un solo valor booleano:Luego puedes llamar a la función envoltorio
valorCombinado
conf
como argumento, de la siguiente manera:Esto ejecutará la lógica dentro del bloque
if
solo si tantovalor
comooperacionExitosa
son verdaderos.Cabe destacar que la función
valorCombinado
toma una función que no tiene argumentos y devuelve dos valores booleanos. Utiliza estos valores para calcular un solo valor booleano que representa la condición combinada de los dos valores originales.