2012-10-11 13 views

risposta

8

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)

+0

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? –

+0

Aggiungere l'opzione -private per visualizzare i campi privati ​​ –

+0

-p e -private sono gli stessi. Ho pubblicato un esempio qui: http://pastebin.com/AkaR6zjM che non mostra campi privati. –

0

Non conosco l'interno del compilatore, ma ecco come può essere fatto. Per ogni variabile locale, il compilatore mantiene un flag inizializzato su false. Ogni volta che la variabile viene utilizzata, il compilatore controlla se viene utilizzato all'interno di una classe o chiusura che non contiene la dichiarazione della variabile; se è così il flag è impostato su true. Alla fine dell'ambito della variabile, se il flag è ancora falso, la variabile può vivere nello stack. Altrimenti deve vivere sul mucchio.

Problemi correlati