English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Una closure es una función, el valor de la cual depende de una o más variables declaradas fuera de la función.
Una closure se puede entender simplemente como otra función que puede acceder a las variables locales de una función.
Como en el siguiente fragmento de función anónima:
val multiplier = (i: Int) => i * 10
En el cuerpo de la función hay una variable i, que es un parámetro de la función. Como en el siguiente fragmento de código:
val multiplier = (i: Int) => i * factor
En multiplier hay dos variables: i y factor. Una de ellas, i, es un parámetro de forma de la función, que se asigna un nuevo valor cuando se llama a la función multiplier. Sin embargo, factor no es un parámetro de forma, sino una variable libre. Considera el siguiente código:
var factor = 3 val multiplier = (i: Int) => i * factor
Aquí introducimos una variable libre factor, que se define fuera de la función.
La variable de función definida de esta manera, multiplier, se convierte en una "cierre" porque referencia a las variables definidas fuera de la función. El proceso de definición de esta función es capturar esta variable libre y constituir una función cerrada.
Ejemplo completo
object Test { def main(args: Array[String]) { println("muliplier(1) value = " + multiplier(1) ) println("muliplier(2) value = " + multiplier(2) ) } var factor = 3 val multiplier = (i: Int) => i * factor }
Ejecutar el código anterior, el resultado de salida es:
$ scalac Test.scala $ scala Test muliplier(1) value = 3 muliplier(2) value = 6