es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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())
“`

Tags:  ,

Answer

  1. Avatar for 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:

    func f() (bool, bool) {
       valor, operacionExitosa := someStuff()
       return valor, operacionExitosa
    }
    
    func valorCombinado(fn func() (bool, bool)) bool {
        v1, v2 := fn()
        return v1 && v2
    }
    

    Luego puedes llamar a la función envoltorio valorCombinado con f como argumento, de la siguiente manera:

    if valorCombinado(f) {
        // hacer algo
    }
    

    Esto ejecutará la lógica dentro del bloque if solo si tanto valor como operacionExitosa 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.

Comments are closed.