Menu
Coddy logo textTech

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

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

challenge icon

Desafio

Fácil

Escreva 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 createMultiplier que receba 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 (number): O valor do multiplicador
  • number (number): O número a ser multiplicado

Retorna:

  • O resultado da multiplicação de number por factor (number)

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 Lógica e Fluxo

Pratique por conta própria: Compilador de Lua online