Czytam książkę programming in Lua
. Powiedział tak
Zamknięcia stanowią cenne narzędzie w wielu kontekstach. Jak widzieliśmy, są one przydatne jako argumenty dla funkcji wyższego rzędu, takich jak sortowanie. Zamknięcia są cenne dla funkcji, które również budują inne funkcje, jak na przykład nasz nowy licznik; ten mechanizm pozwala programom Lua na stosowanie zaawansowanych technik programowania ze świata funkcjonalnego. Zamknięcia są również przydatne w przypadku funkcji oddzwaniania. Typowy przykład występuje tutaj, gdy tworzysz przyciski w konwencjonalnym zestawie narzędzi GUI. Każdy przycisk ma funkcję wywołania zwrotnego, którą należy wywołać, gdy użytkownik naciśnie przycisk; chcesz, aby różne przyciski wykonywały nieco inne czynności po naciśnięciu. Na przykład kalkulator cyfrowy potrzebuje dziesięciu podobnych przycisków, po jednym dla każdej cyfry. Możesz utworzyć każdy z nich za pomocą funkcji takiej jak ta:
function digitButton (digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
Wygląda na to, że jeśli zadzwonię digitButton
, zwróci action
(spowoduje to zamknięcie), więc mogę uzyskać dostęp do digit
przekazanego digitButton
.
Moje pytanie brzmi:
Why we need call back functions? what situations can I apply this to?
Autor powiedział:
W tym przykładzie zakładamy, że Button to funkcja zestawu narzędzi, która tworzy nowe przyciski; etykieta to etykieta przycisku; a działanie to zamknięcie oddzwaniania, które ma zostać wywołane po naciśnięciu przycisku. Oddzwonienie można wywołać długo po tym, jak digitButton wykonał swoje zadanie i po tym, jak cyfra zmiennej lokalnej wyszła poza zakres, ale nadal może uzyskać dostęp do tej zmiennej.
według autora, myślę, że podobny przykład jest taki:
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()
a zatem, the callback can be called a long time after digitButton did its task and after the local variable digit went out of scope.