Saya sedang membaca buku programming in Lua
. Dikatakan begitu
Penutupan menyediakan alat yang berharga dalam banyak konteks. Seperti yang telah kita lihat, mereka berguna sebagai argumen untuk fungsi tingkat tinggi seperti sort. Penutupan juga bermanfaat untuk fungsi yang membangun fungsi lain, seperti contoh Penghitung baru kami; mekanisme ini memungkinkan program Lua untuk menggabungkan teknik pemrograman canggih dari dunia fungsional. Penutupan juga berguna untuk fungsi panggilan balik. Contoh khas di sini terjadi ketika Anda membuat tombol di toolkit GUI konvensional. Setiap tombol memiliki fungsi callback untuk dipanggil ketika pengguna menekan tombol; Anda ingin tombol yang berbeda melakukan hal yang sedikit berbeda ketika ditekan. Misalnya, kalkulator digital membutuhkan sepuluh tombol serupa, satu untuk setiap digit. Anda dapat membuat masing-masing dengan fungsi seperti ini:
function digitButton (digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
Tampaknya jika saya memanggil digitButton
, ia akan mengembalikan action
(ini akan membuat penutupan), jadi, saya dapat mengakses yang digit
diteruskan ke digitButton
.
Pertanyaan saya adalah:
Why we need call back functions? what situations can I apply this to?
Penulis berkata:
Dalam contoh ini, kami menganggap bahwa Button adalah fungsi toolkit yang membuat tombol baru; label adalah label tombol; dan action adalah penutupan callback untuk dipanggil ketika tombol ditekan. Callback dapat dipanggil lama setelah digitButton melakukan tugasnya dan setelah digit variabel lokal keluar dari ruang lingkup, tetapi masih dapat mengakses variabel ini.
menurut penulis, saya pikir contoh serupa adalah seperti ini:
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()
jadi, the callback can be called a long time after digitButton did its task and after the local variable digit went out of scope.