O que é uma Closure?
Parte da seção Logic & Flow do Journey de Lua da Coddy — lição 14 de 54.
Você aprendeu que funções podem ser armazenadas em variáveis, passadas como argumentos e retornadas de outras funções. Agora exploraremos uma das consequências mais poderosas disso: closures.
Um closure ocorre quando uma função aninhada "se lembra" das variáveis locais de sua função envolvente, mesmo após essa função externa ter terminado sua execução. Isso pode parecer estranho a princípio — como uma variável ainda pode existir depois que a função que a criou terminou?
Aqui está um exemplo simples que demonstra este conceito:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- Saída: 1
print(counter()) -- Saída: 2
print(counter()) -- Saída: 3Quando createCounter() é chamada, ela cria uma variável local count e retorna uma função anônima. Normalmente, você esperaria que count desaparecesse assim que createCounter() terminasse. Mas a função retornada ainda tem acesso a count — ela "fecha sobre" essa variável.
Cada vez que você chama counter(), ela acessa e modifica a mesma variável count que foi criada quando createCounter() foi executada pela primeira vez. A função interna carrega seu ambiente consigo, preservando o estado entre as chamadas.
Desafio
FácilEscreva uma função createMultiplier que cria uma função multiplicadora com um fator específico e, em seguida, a utiliza imediatamente para multiplicar um número fornecido.
Lógica:
- Crie uma função aninhada dentro de
createMultiplierque aceite um parâmetro numérico - A função aninhada deve multiplicar seu parâmetro pelo
factorda função externa - A função aninhada formará um closure, lembrando o valor de
factor - Chame a função multiplicadora com o parâmetro
numbere retorne o resultado
Parâmetros:
factor(número): O valor do multiplicadornumber(número): O número a ser multiplicado
Retorno:
- O resultado da multiplicação de
numberporfactor(número)
Folha de consulta
Um closure ocorre quando uma função aninhada "lembra" das variáveis locais de sua função envolvente, mesmo após a função externa ter terminado sua execução.
A função interna carrega seu ambiente consigo, preservando o estado entre as chamadas:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- Saída: 1
print(counter()) -- Saída: 2
print(counter()) -- Saída: 3Quando createCounter() é chamada, ela cria uma variável local count e retorna uma função anônima. A função retornada ainda tem acesso a count — ela "fecha sobre" essa variável, mesmo após a função externa terminar a execução.
Experimente você mesmo
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- Use a função multiply abaixo
endEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Iteração Avançada de Tabelas
Iterando com pairs()Iterando com ipairs()pairs() vs. ipairs()Revisão - Ficha de Personagem2Mais Funções da Biblioteca Table
table.concat()Construção de tabelas e unpack()table.sort()Ordenação personalizada com funçõesRecapitulação - Placar de recordes3Conceitos Avançados de Funções
Retornando Múltiplos ValoresFunções Variádicas (...)Funções como Valores de Primeira ClasseFunções AnônimasO que é uma Closure?Recapitulação - Manipulador de Eventos Simples