Scala - fechamentos

UMA closure é uma função, cujo valor de retorno depende do valor de uma ou mais variáveis ​​declaradas fora desta função.

O seguinte trecho de código com função anônima.

val multiplier = (i:Int) => i * 10

Aqui, a única variável usada no corpo da função, i * 10, é i, que é definido como um parâmetro para a função. Experimente o seguinte código -

val multiplier = (i:Int) => i * factor

Existem duas variáveis ​​livres no multiplicador: i e factor. Um deles, i, é um parâmetro formal para a função. Conseqüentemente, ele é vinculado a um novo valor cada vez que o multiplicador é chamado. Contudo,factornão é um parâmetro formal, então o que é isso? Vamos adicionar mais uma linha de código.

var factor = 3
val multiplier = (i:Int) => i * factor

Agora factortem uma referência a uma variável fora da função, mas no escopo envolvente. As referências de funçãofactore lê seu valor atual a cada vez. Se uma função não tem referências externas, ela é trivialmente fechada sobre si mesma. Nenhum contexto externo é necessário.

Experimente o seguinte programa de exemplo.

Exemplo

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
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

multiplier(1) value = 3
multiplier(2) value = 6