Mentre le funzioni utilizzate non sono rare, devo ammettere che è una combinazione abbastanza strana di funzionalità. Il trucco di base è che qualsiasi blocco in Scala è un'espressione, con il tipo uguale all'ultima espressione nel blocco. Se quell'ultima espressione è una funzione, ciò significa che il blocco ha un tipo funzionale, e quindi può essere usato come argomento per "mappare" o "foreach". Quello che succede in questi casi è che quando viene chiamata "map" o "foreach", il blocco viene valutato. Il blocco valuta una funzione (i => i * 5 nel primo caso) e tale funzione viene quindi mappata nell'intervallo.
Un possibile utilizzo di questo costrutto è che il blocco definisca le variabili mutabili e che la funzione risultante muti le variabili ogni volta che viene chiamata. Le variabili verranno inizializzate una volta, chiuse dalla funzione e i loro valori aggiornati ogni volta che viene chiamata la funzione.
Per esempio, ecco un modo un po 'sorprendente di calcolare i primi 6 numeri fattoriali
(1 to 6) map {
var total = 1
i => {total *= i;total}
}
(BTW, mi spiace per l'utilizzo fattoriale come esempio. Era uno che o Fibonacci. Funzionali regole Progamming Guild. Devi avere problemi con quello, portalo con i ragazzi in fondo alla sala.)
Un motivo meno imperativo per avere una funzione di ritorno di blocco è definire le funzioni di supporto in precedenza nel blocco. Ad esempio, se il secondo esempio erano invece
(1 to 3) foreach {
def line = Console.readLine
i => println(line)
}
Il risultato sarebbe che tre linee sono state leggere e una volta fatto eco, mentre il vostro esempio ha avuto la linea letto una volta e fece eco tre volte.
fonte
2010-07-10 20:55:29
Risposta molto più precisa della mia. +1 – VonC
Nell'esempio fattoriale, dovresti usare 'total * = i' invece di introdurre una seconda variabile chiamata' counter' –
Sì, l'ho capito più tardi. Modificherà –