私はその本を読んでいprogramming in Lua
ます。と言った
クロージャーは、多くの状況で価値のあるツールを提供します。これまで見てきたように、これらはsortなどの高階関数の引数として役立ちます。クロージャーは、newCounterの例のように、他の関数を構築する関数にも役立ちます。このメカニズムにより、Luaプログラムは機能的な世界からの洗練されたプログラミング手法を組み込むことができます。クロージャーはコールバック関数にも役立ちます。ここでの典型的な例は、従来のGUIツールキットでボタンを作成するときに発生します。各ボタンには、ユーザーがボタンを押したときに呼び出されるコールバック関数があります。ボタンを押したときに、ボタンごとにわずかに異なる処理を行う必要があります。たとえば、デジタル計算機には、各桁に1つずつ、10個の同様のボタンが必要です。次のような関数を使用して、それぞれを作成できます。
function digitButton (digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
を呼び出すdigitButton
とを返すように見えるのでaction
(これによりクロージャが作成されます)、digit
渡されたにアクセスできますdigitButton
。
私の質問は:
Why we need call back functions? what situations can I apply this to?
著者は言った:
この例では、Buttonは新しいボタンを作成するツールキット関数であると想定しています。labelはボタンのラベルです。actionは、ボタンが押されたときに呼び出されるコールバッククロージャーです。コールバックは、digitButtonがタスクを実行した後、ローカル変数digitがスコープから出た後、長時間呼び出すことができますが、それでもこの変数にアクセスできます。
著者によると、同様の例は次のようになります。
function Button(t)
-- maybe you should set the button here
return t.action -- so that you can call this later
end
function add_to_display(digit)
print ("Display the button label: " .. tostring(digit))
end
function digitButton(digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
click_action = digitButton(10)
click_action()
したがって、 the callback can be called a long time after digitButton did its task and after the local variable digit went out of scope.