2010-07-17 8 views
8

Sono stato a una conferenza Java su Scala l'altro giorno e l'oratore faceva riferimento a "chiusure a piena potenza". Sto attraversando un periodo difficile per definire una definizione che abbia senso per me. Ho letto la pagina wiki su closures ma in realtà non ha risposto per me. Qualcuno può aiutarmi con una definizione chiara? Forse include anche un semplice esempio.Che cos'è una chiusura completa?

Grazie!

risposta

16

In informatica, una chiusura è una funzione di prima classe con variabili libere che sono legati nell'ambiente lessicale.

Non è necessario più di questa frase dall'articolo di Wikipedia. Quello che manca a Java (oltre alla brutta sintassi) è la caratteristica di vincolare le variabili libere al di fuori della chiusura. Un esempio:

int x = 0; 
new Runnable() { 
    public void run() { 
     x = 1; 
    } 
}.run(); 

Qui il compilatore Java si lamenterà della variabile x.

la stessa cosa in scala funziona bene ed è molto meno verbose:

var x = 0 
val fun =()=>{x=1} 
fun 
+0

Questo è esattamente quello che stavo cercando. Grazie mille! – northpole

+0

@Jesper: No, non funzionerebbe se avessi fatto x final. Mi piacerebbe solo avere un messaggio di errore diverso. ;) Potrei rendere x un array int finale con un solo elemento ... –

+0

@Jesper, le modifiche apportate ai contenuti dell'array 'final' all'interno di' Runnable' saranno visibili in ogni ambito in cui l'array è visibile. –

1

Per quanto ne so, le chiusure full-power non significano nulla in particolare ma possono significare: semplicità di sintassi. C'è un mondo di differenza tra la creazione di una classe interna anonima in Java e l'utilizzo di qualcosa come (a => a < max). Forse la capacità di formare chiusure su tutte le variabili circostanti e non solo su quelle finali.

+2

Questo esempio non è una chiusura (non cattura alcuna variabile dal suo contesto). Comunque con un esempio che ha usato una sintassi più leggera, ed è una chiusura avresti una risposta completamente corretta (perché sospetto anche che l'oratore stia parlando di una sintassi più facile da usare). – Richard

+0

@Richard: buon punto - aggiornato –

+0

@Richard, si stava parlando di rendere le cose meno prolisse bene. – northpole

9

Dal momento mi sento come un principiante (rispetto al DPP e Amber) potrei spiegare a un principiante in una lingua principianti :

Innanzitutto, la funzione anonima (o espressione di codice/espressione lambda) è semplicemente una funzione che non ha un nome. Potrebbe essere legato a una variabile come questa.

scala> val foo = (x: Int) => 2*x 
foo: (Int) => Int = <function1> 

scala> val bar = foo 
bar: (Int) => Int = <function1> 

scala> bar(5) 
res2: Int = 10 

Vedete, la funzione non ha il nome foo, potrebbe invece essere chiamata dalla barra.

In secondo luogo, una chiusura è una funzione anonima che ha una variabile che non è definita all'interno della funzione (la variabile/valore deve essere stata dichiarata prima che la funzione sia definita). Il termine "chiusura a pieno carico" potrebbe riferirsi a questa funzionalità.

scala> var constant = 7 
constant: Int = 7 

scala> val foo = (x: Int) => 2*x + constant 
foo: (Int) => Int = <function1> 

scala> foo(5) 
res3: Int = 17 

scala> constant = 6 
constant: Int = 6 

scala> foo(5) 
res4: Int = 16 

La prima volta che vedi questo, potresti chiederti a cosa serva. In breve, ha molti settori di applicazione :-)

+0

spiegazione eccellente, grazie! – northpole

Problemi correlati