callback function 可以說是「如果發生了某件事,就做這件事」。就像是蝙蝠俠跟高譚市警察局說:「如果看見罪犯,就打開蝙蝠燈呼叫我。」也可以像是城市獵人一般,遇到麻煩就在新宿車站的留言板上寫下 XYZ。
蝙蝠俠當然可以把這件事情抽換成「如果看見罪犯,就到新宿車站的留言板寫下 XYZ」
圖中被打上馬賽克的部份就是 callback function。這個 callback function 可以是請對方吃冰淇淋,一起研究數學推導公式,或是賞他一巴掌,whatever you want。
我們在寫程式的時候,往往就是扮演正妹 A 的角色,寫了一個計畫 (function),告訴正妹 B (library,通常就是處理 event 的部份) 在符合條件的情況下執行計畫。
這樣的機制在圖形化介面裡十分重要,現今的 GUI toolkit 大多數都是使用事件驅動的方式 (event driven),使用者按下了某個按鍵,我們就去執行特定的工作。原因在於:我們無法預期現在使用者會按下 Yes or No。
callback function 是甚麼?它就是我們要提供的一個解法。有了 callback function 便能做到許多抽象化的處理,譬如說在上層我們指派黑社會娘娘腔金牌殺手去對付丁力。提供不同的 callback function,底下的金牌殺手就可能用毒蛇、用迴力標,甚至是家屬謝禮散。
川島芳子小姐只在乎丁力有沒有被殺死,至於怎麼被殺死的,她不管!
底下是一小段簡單的程式碼,希望可以給還不了解的朋友一點點幫助。透過 function pointer,同樣是呼叫 exe_callback() 卻產生不一樣的結果。
1 #include
2 #include
3
4 /******** in another library ******/
5 static void (*callback_func)() = NULL;
6
7 void set_callback(void (*callback)()) {
8 callback_func = callback;
9 }
10
11 void exe_callback() {
12 if(callback_func == NULL) {
13 printf("No callback function!!\n");
14 }else {
15 callback_func();
16 }
17 }
18 /**************** End *******************/
19
20 void say_hello() {
21 printf("Hello, Girl\n");
22 }
23
24 void say_byebye() {
25 printf("Byebye, girl!\n");
26 }
27
28 int main() {
29 set_callback(say_hello);
30 printf("Execute callback function:");
31 exe_callback();
32 set_callback(say_byebye);
33 printf("Execute callback function:");
34 exe_callback();
35 return 0;
36 }
沒有留言:
張貼留言