lua関数の閉パッケージ


function newCounter()
  local i = 0
  return function()     -- anonymous function
  i = i + 1
   return i
  end
end

c1 = newCounter()
print(c1())  --> 1
print(c1())  --> 2

c2 = newCounter()
print(c2())  --> 1
print(c1())  --> 3
print(c2())  --> 2

print(newCounter()()) --> 1
print(newCounter()()) --> 1
print(newCounter()()) --> 1

P.S::匿名関数を返す場合は、()を追加して匿名関数の内容を呼び出す必要があります.
c 1、c 2は、同じ関数に基づいているが、同じ局所変数の異なるインスタンスに作用する2つの異なる閉パケットである.技術的には、閉パケットは関数ではなく値を指し、関数は閉パケットのプロトタイプ宣言にすぎない.それでも、混同を招くことなく、閉パッケージを指す用語関数を引き続き使用します. 
クローズドパッケージはコンテキスト環境で有用な機能を提供します.前述したように,高度な関数(sort)として使用できるパラメータ,関数としてネストされた関数(newCounter).このメカニズムにより、Luaの関数の世界でファンタジーなプログラミング技術を組み合わせることができます.閉パッケージはコールバック関数にも使用できます.例えば、GUI環境ではbuttonを作成する必要がありますが、ユーザーがbuttonを押すとコールバック関数が呼び出され、異なるボタンが押されると処理するタスクが少し異なる可能性があります.具体的には、10進コンピューターには10個の似たようなボタンが必要です.各ボタンには数字が対応しています.次の関数を使用して作成できます.
function digitButton (digit) 
  return Button{  label = digit, 
   action = function () 
    add_to_display(digit) 
    end 
 } 
end 

この例では、Buttonは新しいボタンを作成するためのツールであり、labelはボタンのラベルであり、actionはボタンが押されたときに呼び出されるコールバック関数であると仮定します.(実際には、upvalue digitにアクセスしているため、閉パッケージです).digitButtonがタスクを完了して戻った後、ローカル変数digitが範囲を超え、コールバック関数
add_to_displayは依然として呼び出され、ローカル変数digitにアクセスすることができる.