English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Closure do Scala

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