クロージャー

Lua は、クロージャーをフルサポートする機能プログラミング言語です。 新しい関数が作成されるとき、 ローカル変数はすべてその関数のインスタンスに結合されます。 これは、イテレーター関数の作成、 およびオブジェクト指向プログラミングの専用変数の作成に使用できます。

クロージャを使う最も簡単な例のひとつは、「aforループで使えるイテレータ関数を作ることだ。
function counter(i)
local x=0
return function()
x=x+1
if x > i then return null end
return x
end
end
上の例では、counter 関数が呼び出されるたびに、新しいイテレーター関数が作成されます。 ローカル変数 x と i の値は、そのイテレーター関数のインスタンスに結合され、他のどの関数からもアクセスできません。 関数仮パラメーターは、local キーワードを使用して宣言された 変数であるとして、常にローカル変数と見なされます。 次に示すように、counter 関数は for ループと組み合わせて使用できます。
sum=0
for i in counter(5) do
for j in counter(5) do
sum = sum + j
end
end
次の例に示すように、クロージャーの概念は、オブジェクト指向プログラミングのデータ・プライバシーをサポートするためにも使用できます。
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()

クロージャを使うよりも、メタテーブルを使ってオブジェクトを作る方が一般的だが、メタテーブルでは、クロージャを使ってできるようなデータ・プライバシーの実装はできない。