Chiusure

Lua è un linguaggio di programmazione funzionale con pieno supporto per le chiusure. Quando viene creata una nuova funzione, tutte le variabili locali vengono vincolate all'istanza della funzione. Questo può essere usato per creare funzioni iteratrici e per creare variabili private per la programmazione orientata agli oggetti.

Uno degli esempi più semplici di utilizzo di una chiusura è la creazione di una funzione iteratore che può essere utilizzata nel ciclo for di 'a.
function counter(i)
local x=0
return function()
x=x+1
if x > i then return null end
return x
end
end
Nell'esempio precedente, ogni volta che viene richiamata la funzione contatore, viene creata una nuova funzione iteratore. I valori delle variabili locali x e i sono legati a quell'istanza della funzione iteratore e non sono accessibili da nessun'altra funzione. I parametri delle funzioni sono sempre considerati variabili locali, così come tutte le variabili dichiarate con la parola chiave local. La funzione contatore può essere utilizzata in combinazione con un ciclo for, come mostrato di seguito.
sum=0
for i in counter(5) do
for j in counter(5) do
sum = sum + j
end
end
Il concetto di chiusura può essere utilizzato anche per supportare la riservatezza dei dati per la programmazione orientata agli oggetti, come mostrato nel prossimo esempio.
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()

È più comune usare le metatabelle per creare oggetti che le chiusure, ma le metatabelle non forniscono un buon modo per implementare la privacy dei dati, come invece si può fare con le chiusure.