Ich lese das Buch programming in Lua
. Das hat es gesagt
Verschlüsse sind in vielen Zusammenhängen ein wertvolles Werkzeug. Wie wir gesehen haben, sind sie als Argumente für Funktionen höherer Ordnung wie sort nützlich. Closures sind wertvoll für Funktionen, die auch andere Funktionen erstellen, wie in unserem newCounter-Beispiel. Dieser Mechanismus ermöglicht es Lua-Programmen, ausgefeilte Programmiertechniken aus der Funktionswelt zu integrieren. Closures sind auch für Callback-Funktionen nützlich. Ein typisches Beispiel hierfür ist das Erstellen von Schaltflächen in einem herkömmlichen GUI-Toolkit. Jede Taste verfügt über eine Rückruffunktion, die aufgerufen wird, wenn der Benutzer die Taste drückt. Sie möchten, dass verschiedene Tasten beim Drücken etwas unterschiedliche Aktionen ausführen. Ein digitaler Taschenrechner benötigt beispielsweise zehn ähnliche Tasten, eine für jede Ziffer. Sie können jede davon mit einer Funktion wie der folgenden erstellen:
function digitButton (digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
Es scheint, dass, wenn ich das aufrufe digitButton
, es das zurückgibt action
(dies erzeugt einen Abschluss), so dass ich auf das digit
übergebene zugreifen kann digitButton
.
Meine Frage ist, dass:
Why we need call back functions? what situations can I apply this to?
Der Autor sagte:
In diesem Beispiel wird angenommen, dass Button eine Toolkit-Funktion ist, mit der neue Schaltflächen erstellt werden. label ist die Tastenbezeichnung; und action ist die Rückrufsperre, die beim Drücken der Taste aufgerufen wird. Der Rückruf kann lange Zeit, nachdem digitButton seine Aufgabe erfüllt hat und nachdem die Ziffer der lokalen Variablen den Gültigkeitsbereich verlassen hat, aufgerufen werden, kann jedoch weiterhin auf diese Variable zugegriffen werden.
Nach Meinung des Autors ist ein ähnliches Beispiel wie folgt:
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()
somit, the callback can be called a long time after digitButton did its task and after the local variable digit went out of scope.