クロージャー

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

クロージャーを使用する最も単純な例の 1 つは、for ループの中で使用できるイテレーター関数の作成です。

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()

オブジェクトの作成には、クロージャーを使用するよりもメタテーブル (『メタテーブル』を参照) を使用する方が一般的ですが、データ・プライバシーの実装では、メタテーブルは、クロージャーでできる良い方法を提供しません。