Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Definição e declaração
  2. Closure em iterador
  3. Escopo
  4. Declarar parâmetros
  5. Parâmetro com valor padrão
  6. Checar o tipo de parâmetros
  7. Retornar um ou mais valores
  8. Parâmetros variáveis
  9. Função sem retorno com return
  10. Função local/interna
  11. "Argumento nomeado"
  12. "Parâmetro opcional"

Closure é uma função local, sem nome e retornada, que carrega consigo seu estado ou contexto sendo possível acessar variáveis locais. A declaração de uma closure em Lua é feita como na sintaxe básica abaixo:

Sintaxe:
return n nome_funcao() 
    --uso de variáveis locais/globais
    return valor
end
Exemplo 1
function funcao() --função principal
  local var = 0
  print("funcao principal")
  
  return function() --função closure
     print("funcao closure")
     var = var + 1
     return var
  end
end

--uso
closure = funcao()

print(closure())
print(closure())
print(closure())
Saída
funcao principal
funcao closure
1
funcao closure
2
funcao closure
3

Para gerar uma sequência de valores utilizada em iteradores, na closure definimos um limite para interromper a geração da sequência dinâmica desejada. Assim, podemos usar nossa função geradora para ser iterada pelo comando for que invoca a nossa closure a cada loop.

Exemplo 2
function funcao() --função principal
  local var = 0 

  return function() --closure
     var = var + 1
     if var <=10 then
      return var
     end
  end
end

--iteração
for valor in funcao() do
   print(valor)
end 
Saída
1
2
3
4
5
6
7
8
9
10

Como visto nos exemplos acima, uma closure pode acessar em seu corpo variáveis locais da função a qual a closure está aninhada e que fazem parte seu contexto:

Exemplo 3
function funcao() --função principal/geradora
  local varF = 0 
  return function() --função closure
     local varC = 3
     varF = varF*varC + 1
     return varF
  end
end

closure = funcao()

print(closure())
print(closure())
print(closure())
Saída
1
4
13

Variáveis globais também podem ser acessadas como pode ser observado no exemplo a seguir em que uma variável global é utilizada na expressão de retorno da closure:

Exemplo 4
varG = 2 --global
function funcao() --função principal
  local varF = 0 --local
  return function() --função closure
     local varC = 3 --local
     varF = varF*varC + 1
     return varF*varG
  end
end

closure = funcao()

print(closure())
print(closure())
print(closure())
Saída
2
8
26
  1. 25/05/2025 - versão inicial - Adição: closure, 'closure com iterador' e escopo