Menu
Coddy logo textTech

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: 3

Quando 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.

challenge icon

Desafio

Fácil

Escreva 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 createMultiplier que aceite um parâmetro numérico
  • A função aninhada deve multiplicar seu parâmetro pelo factor da função externa
  • A função aninhada formará um closure, lembrando o valor de factor
  • Chame a função multiplicadora com o parâmetro number e retorne o resultado

Parâmetros:

  • factor (número): O valor do multiplicador
  • number (número): O número a ser multiplicado

Retorno:

  • O resultado da multiplicação de number por factor (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: 3

Quando 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

end
quiz iconTeste seus conhecimentos

Esta 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