ho trovato questo modello un bel paio di volte nel mio codice:condizionale invocazione di un metodo in Scala
if (doIt)
object.callAMethod
else
object
mi chiedo se ci potrebbe essere un modo sintatticamente più piacevole di scrivere il codice di cui sopra, soprattutto per evitare la ripetizione della variabile object
. Qualcosa di simile:
// using the Scalaz "pipe" operator
// and "pimping" f: T => T with a `when` method
object |> (_.callAMethod).when(doIt)
Purtroppo la linea di cui sopra non riesce perché l'inferenza di tipo richiede un tipo di parametro per (_.callAMethod)
.
Il mio approccio migliore per ora è questo:
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)
Non è fantastico, perché devo dichiarare un implicit val
ma questo ripaga se ci sono diverse chiamate incatenate:
object ?> (_.callAMethod) ?> (_.callAnotherMethod)
Qualcuno ha un migliore idea? Mi sto perdendo della magia degli Scalaz qui?
Non ho pensato di invertire la condizione e la funzione, grazie! – Eric
Ho anche notato che un sostantivo va meglio qui di un operatore perché il '.' deve essere usato dopo" "pesce" '. – Eric