O que é um Closure?
Parte da seção Lógica e Fluxo do Journey de Lua da Coddy. Lição 14 de 54.
Você aprendeu que as funções podem ser armazenadas em variáveis, passadas como argumentos e retornadas por outras funções. Agora vamos explorar uma das consequências mais poderosas disso: os closures.
Uma closure ocorre quando uma função aninhada “lembra” as variáveis locais de sua função envolvente, mesmo depois que essa função externa terminou de ser executada. Isso pode parecer estranho no início: como uma variável ainda pode existir depois que a função que a criou terminou?
Aqui está um exemplo simples que demonstra esse 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 function anônima. Normalmente, você esperaria que count desaparecesse assim que createCounter() terminasse. Mas a function retornada ainda tem acesso a count. Ela “captura” essa variável.
Cada vez que você chama counter(), ele acessa e modifica a mesma variável count que foi criada quando createCounter() foi executada pela primeira vez. A função interna carrega consigo seu ambiente, preservando o estado entre as chamadas.
Desafio
FácilEscreva uma função createMultiplier que crie uma função multiplicadora com um fator específico e, em seguida, use-a imediatamente para multiplicar um número fornecido.
Lógica:
- Crie uma função aninhada dentro de
createMultiplierque receba 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(number): O valor do multiplicadornumber(number): O número a ser multiplicado
Retorna:
- O resultado da multiplicação de
numberporfactor(number)
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 Lógica e Fluxo
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çõesRevisão - Placar de pontuações máximas3Conceitos Avançados de Funções
Retornando Múltiplos ValoresFunções Variádicas (...)Funções como Valores de Primeira ClasseFunções AnônimasO que é um Closure?Recapitulação - Manipulador de Eventos SimplesPratique por conta própria: Compilador de Lua online