Scala - Cierres
UN closure es una función, cuyo valor de retorno depende del valor de una o más variables declaradas fuera de esta función.
El siguiente fragmento de código con función anónima.
val multiplier = (i:Int) => i * 10
Aquí, la única variable utilizada en el cuerpo de la función, i * 10, es i, que se define como un parámetro de la función. Prueba el siguiente código:
val multiplier = (i:Int) => i * factor
Hay dos variables libres en multiplicador: i y factor. Uno de ellos, i, es un parámetro formal de la función. Por lo tanto, está vinculado a un nuevo valor cada vez que se llama al multiplicador. Sin embargo,factorno es un parámetro formal, entonces ¿qué es esto? Agreguemos una línea más de código.
var factor = 3
val multiplier = (i:Int) => i * factor
Ahora factortiene una referencia a una variable fuera de la función pero en el ámbito adjunto. La función hace referenciafactory lee su valor actual cada vez. Si una función no tiene referencias externas, entonces se cierra trivialmente sobre sí misma. No se requiere contexto externo.
Pruebe el siguiente programa de ejemplo.
Ejemplo
object Demo {
def main(args: Array[String]) {
println( "multiplier(1) value = " + multiplier(1) )
println( "multiplier(2) value = " + multiplier(2) )
}
var factor = 3
val multiplier = (i:Int) => i * factor
}
Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.
Mando
\>scalac Demo.scala
\>scala Demo
Salida
multiplier(1) value = 3
multiplier(2) value = 6