Bien ... si quieres ser técnico, este es un literal de función que se traduce en tiempo de ejecución en un cierre, cerrando los términos abiertos (vinculándolos a un val/var en el ámbito de la función literal). Además, en el contexto de esta función literal (_.sales >= threshold
), threshold
es una variable gratuita, ya que la función literal no le da ningún significado. Por sí mismo, _.sales >= threshold
es un término abierto En tiempo de ejecución, está ligado a la variable local de la función, cada vez que se llama a la función.
Tome esta función por ejemplo, la generación de cierres:
def makeIncrementer(inc: Int): (Int => Int) = (x: Int) => x + inc
En tiempo de ejecución, el código siguiente produce 3 cierres. También es interesante observar que byc no son el mismo cierre (b == c
da false
).
val a = makeIncrementer(10)
val b = makeIncrementer(20)
val c = makeIncrementer(20)
Sigo pensando que el ejemplo dado en la wikipedia es bueno, aunque no cubre por completo la historia. Es bastante difícil dar un ejemplo de cierres reales por la definición más estricta sin tener realmente un volcado de memoria de un programa en ejecución. Es lo mismo con la relación clase-objeto. Por lo general, da un ejemplo de un objeto definiendo un class Foo { ...
y luego instanciando con val f = new Foo
, diciendo que f es el objeto.
-- Flaviu Cipcigan
Notas:
- Referencia: Programación en Scala, Martin Odersky, Lex cuchara, Bill Venners
- Código compilado con Scala versión 2.7.5.final se ejecuta en Java 1.6.0_14 .
¿Por qué threshold es un término cerrado? Es una variable local que es capturada por la función cuando se pasa al método de filtro, ¿no? – skaffman
tienes razón. umbral no es un término cerrado, su variable libre y el cierre es un término abierto. – Schildmeijer