Sto leggendo il libro programming in Lua
. Detto questo
Le chiusure forniscono uno strumento prezioso in molti contesti. Come abbiamo visto, sono utili come argomenti per funzioni di ordine superiore come l'ordinamento. Le chiusure sono utili per le funzioni che creano anche altre funzioni, come il nostro esempio newCounter; questo meccanismo consente ai programmi Lua di incorporare sofisticate tecniche di programmazione dal mondo funzionale. Le chiusure sono utili anche per le funzioni di callback. Un esempio tipico qui si verifica quando si creano pulsanti in un toolkit GUI convenzionale. Ogni pulsante ha una funzione di richiamata da chiamare quando l'utente preme il pulsante; vuoi che pulsanti diversi facciano cose leggermente diverse quando vengono premuti. Ad esempio, una calcolatrice digitale necessita di dieci pulsanti simili, uno per ogni cifra. Puoi crearli ciascuno con una funzione come questa:
function digitButton (digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
Sembra che se chiamo il digitButton
, restituirà il action
(questo creerà una chiusura), quindi posso accedere al digit
passato digitButton
.
La mia domanda è che:
Why we need call back functions? what situations can I apply this to?
L'autore ha detto:
In questo esempio, supponiamo che Button sia una funzione di toolkit che crea nuovi pulsanti; l'etichetta è l'etichetta del pulsante; e action è la chiusura del callback da chiamare quando si preme il pulsante. Il callback può essere chiamato molto tempo dopo che digitButton ha svolto il suo compito e dopo che la cifra della variabile locale è uscita dall'ambito, ma può comunque accedere a questa variabile.
secondo l'autore, penso che un esempio simile sia questo:
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()
in tal modo, the callback can be called a long time after digitButton did its task and after the local variable digit went out of scope.