Una funzione anonima (e in realtà qualsiasi funzione) in scala è in realtà un oggetto (un'istanza di Function*
). Quando viene istanziato, l'acquisizione di vals viene eseguita copiando i vals in campi interni dell'oggetto funzione. Nel corpo della funzione (vale a dire nel metodo apply
dell'oggetto della funzione) l'accesso ai valori acquisiti viene eseguito accedendo a questi campi.
L'acquisizione di vars è simile, tranne che il compilatore deve aggiungere un livello di riferimento indiretto: il valore var è accessibile tramite qualche supporto mutabile nascosto (semplicemente un oggetto con un campo mutabile che punta al valore corrente della var) e questo è il titolare che viene copiato nell'oggetto funzione. Quando si scrive in var (tramite codice locale o oggetto funzione), è il campo del titolare che viene scritto. Questo meccanismo garantisce che il codice locale e il codice della funzione manipolino gli stessi dati, ed entrambi vedono le modifiche l'uno dell'altro.
Quindi la risposta è che un vals catturate e una var catturato entrambi vivono sempre sul mucchio (direttamente come un campo dell'oggetto funzione o come un campo di qualche oggetto wrapper)
fonte
2012-10-11 04:39:26
non riesco a vedere uno di questi campi se eseguo 'javap -p Test $$ anonfun $ 1.class' (una funzione anonima in un oggetto' Test') - qualche idea perché no? –
Aggiungere l'opzione -private per visualizzare i campi privati –
-p e -private sono gli stessi. Ho pubblicato un esempio qui: http://pastebin.com/AkaR6zjM che non mostra campi privati. –