English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
A closure é uma função cujo valor de retorno depende de uma ou mais variáveis declaradas fora da função.
A closure pode ser simplesmente considerada como outra função que pode acessar variáveis locais de uma função.
Aqui está um exemplo de função anônima:
val multiplier = (i: Int) => i * 10
Há uma variável i dentro do corpo da função, que é um parâmetro da função. Abaixo está outro exemplo de código:
val multiplier = (i: Int) => i * factor
No multiplier há duas variáveis: i e factor. Uma delas, i, é um parâmetro de forma da função, que ganha um novo valor quando a função multiplier é chamada. No entanto, factor não é um parâmetro de forma, mas uma variável livre. Considere o seguinte código:
var factor = 3 val multiplier = (i: Int) => i * factor
Aqui introduzimos uma variável livre, factor, definida fora da função.
A função variável definida assim, multiplier, se torna uma "closure" porque ela referencia variáveis definidas fora da função. O processo de definição dessa função captura essa variável livre e constitui uma função encerrada.
Exemplo 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 }
Executar o código acima, o resultado será:
$ scalac Test.scala $ scala Test muliplier(1) value = 3 muliplier(2) value = 6