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