Kitabı okuyorum programming in Lua
. Dedi ki
Kapaklar birçok bağlamda değerli bir araç sağlar. Gördüğümüz gibi, bunlar sıralama gibi üst düzey işlevlerin argümanları olarak yararlıdır. Kapaklar, newCounter örneğimiz gibi diğer işlevleri de oluşturan işlevler için değerlidir; bu mekanizma, Lua programlarının fonksiyonel dünyadan gelişmiş programlama tekniklerini kullanmasını sağlar. Kapaklar geri arama işlevleri için de yararlıdır. Burada tipik bir örnek, geleneksel bir GUI araç setinde düğmeler oluşturduğunuzda ortaya çıkar. Her düğmede, kullanıcı düğmeye bastığında çağrılacak bir geri arama işlevi vardır; farklı düğmelere basıldığında biraz farklı şeyler yapmasını istiyorsunuz. Örneğin, bir dijital hesap makinesinin her basamak için bir tane olmak üzere on benzer düğmeye ihtiyacı vardır. Her birini aşağıdaki gibi bir işlevle oluşturabilirsiniz:
function digitButton (digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
Ararsam görünüyor digitButton
, bu dönecektir action
bu yüzden, ben erişebilir, (bu bir kapatma yaratacaktır) digit
geçirilir digitButton
.
Sorum şu:
Why we need call back functions? what situations can I apply this to?
Yazar dedi ki:
Bu örnekte, Button'ın yeni düğmeler oluşturan bir araç takımı işlevi olduğunu varsayıyoruz; etiket düğme etiketidir; ve eylem, düğmeye basıldığında çağrılacak geri arama kapanışıdır. Geri arama, digitButton görevini yaptıktan ve yerel değişken basamak kapsam dışına çıktıktan uzun bir süre sonra çağrılabilir, ancak yine de bu değişkene erişebilir.
yazara göre, benzer bir örnek şöyle düşünüyorum:
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()
Böylece, the callback can be called a long time after digitButton did its task and after the local variable digit went out of scope.