Fechamentos

Lua é uma linguagem de programação funcional com suporte total a closures. Quando uma nova função é criada, todas as variáveis locais ficam vinculadas a essa instância da função. Isso pode ser usado para criar funções de iterador, bem como para criar variáveis privadas para programação orientada a objetos.

Um dos exemplos mais simples de uso de uma closure é criar uma função de iterador que pode ser usada no loop for ' a.
function counter(i)
local x=0
return function()
x=x+1
if x > i then return null end
return x
end
end
No exemplo acima, toda vez que a função de contador é chamada, ela cria uma nova função de iterador. Os valores das variáveis locais x e i estão vinculados a essa instância da função iteradora e não podem ser acessados por nenhuma outra função. Os parâmetros de função são sempre considerados variáveis locais, assim como quaisquer variáveis declaradas com a palavra-chave local. A função de contador pode ser usada em combinação com um loop for, conforme mostrado abaixo.
sum=0
for i in counter(5) do
for j in counter(5) do
sum = sum + j
end
end
O conceito de fechamento também pode ser usado para dar suporte à privacidade de dados para programação orientada a objetos, conforme mostrado no próximo exemplo.
function newAccount(balance)

local t={}

t.deposit = function(amount)
balance = balance + amount
return balance
end

t.withdraw = function(amount)
balance = balance - amount
return balance

end

t.getBalance = function()
return balance

end

return t
end

account = newAccount(1000)
account.deposit(100)
account.withdraw(500)

balance = account.getBalance()

É mais comum usar metatabelas para criar objetos do que usar closures, mas as metatabelas não oferecem uma boa maneira de implementar a privacidade dos dados, como pode ser feito usando closures.