he encontrado este patrón unas cuantas veces en mi código:invocación condicional de un método en el Scala
if (doIt)
object.callAMethod
else
object
Me pregunto si podría haber una forma sintácticamente más agradable a escribir el código anterior, especialmente para evitar la repetición de la variable object
. Algo así como:
// using the Scalaz "pipe" operator
// and "pimping" f: T => T with a `when` method
object |> (_.callAMethod).when(doIt)
Desafortunadamente la línea anterior falla porque la inferencia de tipos requiere un tipo de parámetro para (_.callAMethod)
.
Mi mejor enfoque por ahora es la siguiente:
implicit def doItOptionally[T](t: =>T) = new DoItOptionally(t)
class DoItOptionally[T](t: =>T) {
def ?>(f: T => T)(implicit doIt: Boolean = true) =
if (doIt) f(t) else t
}
implicit val doIt = true
object ?> (_.callAMethod)
No es muy bueno porque tengo que declarar una implicit val
pero esto vale la pena si hay varias llamadas encadenadas:
object ?> (_.callAMethod) ?> (_.callAnotherMethod)
¿Alguien tiene una ¿mejor idea? ¿Me estoy perdiendo algo de magia Scalaz aquí?
No pensé de invertir el estado y la función, gracias! – Eric
También observo que un sustantivo va mejor aquí que un operador porque el '.' necesita ser utilizado después de' "fish" '. – Eric