Provengo da Groovy e ha un metodo .with
su ogni tipo che accetta una chiusura a singolo argomento; l'argomento è l'oggetto su cui viene chiamato il metodo .with
. Ciò consente una tecnica molto interessante di estendere le funzionalità di concatenamento funzionale, che ti libera dall'obbligo di introdurre variabili temporanee, influisce sul tuo codice, rende più facile la lettura e altre sottigliezze..con alternativa in scala
Voglio essere in grado di fare qualcosa del genere:
Seq(1, 2, 3, 4, 5)
.filter(_ % 2 == 0)
.with(it => if (!it.isEmpty) println(it))
Invece di
val yetAnotherMeaninglessNameForTemporaryVariable =
Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
if (!yetAnotherMeaninglessNameForTemporaryVariable.isEmpty)
println(yetAnotherMeaninglessNameForTemporaryVariable)
In altre parole il primo esempio del .with
è un pò simile a .foreach
ma invece di iterazione attraverso gli oggetti dell'oggetto che viene chiamato una volta sull'oggetto stesso. Quindi it
equivale a Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
.
Fin da quando ero molto sorpreso di non trovare niente di simile a Scala, le mie domande sono:
- mi sto perdendo qualcosa?
- esistono tecniche alternative native per Scala?
- in caso contrario, ci sono motivi validi per cui questa funzione non è implementata in Scala?
Aggiornamento: Una richiesta di funzionalità appropriata è stata pubblicata sulla questione inseguitore Scala: https://issues.scala-lang.org/browse/SI-5324. Si prega di votare e promuovere
Solo una nota: 'with' è una parola riservata in Scala, quindi il metodo non può essere chiamato la stessa cosa. Dovrebbe ancora esistere sotto un altro nome; questa è la domanda Scala più comune e answer_ su StackOverflow per quanto posso dire ("non esiste, crea il tuo come questo")! –
Penso che il nome 'convert' si adatterebbe meglio, suggerendo quindi che questo metodo non dovrebbe avere effetti collaterali e dal momento che prende il chiamante come parametro e restituisce qualcosa di nuovo, deve essere una sorta di conversione. In questo senso questa funzione sarebbe insostituibile nella libreria standard. Inoltre, come suggerito in http://stackoverflow.com/a/8538277/485115, dovrebbe esserci anche una variante a effetto collaterale chiamata 'tap', che restituisce l'oggetto chiamante. –