2010-07-17 10 views
8

Estuve en una conferencia de Java en Scala el otro día y el orador se refirió a "cierres a plena potencia". Estoy teniendo dificultades para definir una definición que tenga sentido para mí. He leído la página wiki en closures pero realmente no me ha respondido. ¿Alguien puede ayudarme con una definición clara? Tal vez incluso incluya un simple ejemplo.¿Qué es un cierre de potencia completa?

Gracias!

Respuesta

16

En informática, un cierre es una función de primera clase con variables libres que están vinculados en el entorno léxico.

No necesita más que esta frase del artículo de la wikipedia. Lo que Java carece (además de la sintaxis fea) es la característica de vincular variables libres desde fuera del cierre. Un ejemplo:

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

Aquí el compilador de Java se quejará de la variable x.

Lo mismo en Scala funciona muy bien y es mucho menos detallado:

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

Esto es exactamente lo que estaba buscando. ¡Gracias un montón! – northpole

+0

@Jesper: No, no funcionaría si hice x final. Me gustaría obtener un mensaje de error diferente. ;) Podría hacer x una matriz int final con solo un elemento ... –

+0

@Jesper, las modificaciones hechas a los contenidos de la matriz 'final' dentro de la' Runnable' serán visibles en todos los ámbitos donde la matriz es visible. –

1

Hasta donde yo sé, los cierres con alimentación completa no significan nada en particular, pero puede significar: simplicidad de sintaxis. Hay un mundo de diferencia entre actualizar una clase interna anónima en Java vs. usar algo como (a => a < max). Quizás la capacidad de formar cierres en todas las variables circundantes no solo en las finales.

+2

Ese ejemplo no es un cierre (no captura ninguna variable de su contexto). Sin embargo, con un ejemplo que utiliza una sintaxis de peso más ligero, y es un cierre, tendría una respuesta completamente correcta (porque también sospecho que el hablante hablaba de una sintaxis más fácil de usar). – Richard

+0

@Richard: Buen punto - actualizado –

+0

@Richard, sí, él estaba hablando de hacer que las cosas menos prolijas estuvieran bien. – northpole

9

Dado que me siento como un principiante (en comparación con DPP y Amber) Me podría explicar a un principiante en un idioma principiantes :

En primer lugar, la función anónima (o bloque de código/expresión lambda) es simplemente una función que no tiene un nombre. Podría estar relacionado con una variable como esta.

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 

Verá, la función no tiene el nombre foo, podría llamarse desde la barra en su lugar.

En segundo lugar, un cierre es una función anónima que tiene una variable que no está definida dentro de la función (la variable/valor debe haberse declarado antes de que se defina la función). El término "cierre completo" puede referirse a esta funcionalidad.

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 primera vez que vea esto, se preguntará para qué sirve. En resumen, tiene muchos sectores de aplicación :-)

+0

excelente explicación, gracias! – northpole

Cuestiones relacionadas