मैं किताब पढ़ रहा हूं programming in Lua
। इसने कहा कि
क्लोजर कई संदर्भों में एक मूल्यवान उपकरण प्रदान करते हैं। जैसा कि हमने देखा है, वे उच्च-क्रम वाले कार्यों जैसे तर्क के रूप में उपयोगी हैं। क्लोजर उन कार्यों के लिए मूल्यवान हैं जो अन्य कार्यों का भी निर्माण करते हैं, जैसे कि हमारे newCounter उदाहरण; यह तंत्र लुआ कार्यक्रमों को कार्यात्मक दुनिया से परिष्कृत प्रोग्रामिंग तकनीकों को शामिल करने की अनुमति देता है। कॉलबैक फ़ंक्शंस के लिए भी क्लोज़र उपयोगी हैं। यहां एक विशिष्ट उदाहरण तब होता है जब आप पारंपरिक जीयूआई टूलकिट में बटन बनाते हैं। जब उपयोगकर्ता बटन दबाता है तो प्रत्येक बटन में कॉलबैक फ़ंक्शन होता है; जब आप दबाए जाते हैं तो आप अलग-अलग बटन चाहते हैं। उदाहरण के लिए, एक डिजिटल कैलकुलेटर को दस समान बटन की आवश्यकता होती है, प्रत्येक अंक के लिए एक। Y ou इस तरह के एक समारोह के साथ उनमें से प्रत्येक बना सकते हैं:
function digitButton (digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
ऐसा लगता है कि अगर मैं फोन digitButton
, यह वापस आ जाएगी action
(यह एक बंद पैदा करेगा), इसलिए, मैं उपयोग कर सकते हैं digit
करने के लिए पारित कर दिया digitButton
।
मेरा सवाल यह है कि:
Why we need call back functions? what situations can I apply this to?
लेखक ने कहा:
इस उदाहरण में, हम मानते हैं कि बटन एक टूलकिट फ़ंक्शन है जो नए बटन बनाता है; लेबल बटन लेबल है; और बटन दबाए जाने पर कॉलबैक क्लोजर को कॉल किया जाना है। डिजिटबैक अपने कार्य को करने के बाद कॉलबैक को एक लंबे समय के बाद कहा जा सकता है और स्थानीय चर अंक के दायरे से बाहर हो जाने के बाद भी यह इस चर तक पहुंच सकता है।
लेखक के अनुसार, मुझे लगता है कि एक समान उदाहरण इस प्रकार है:
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()
इस प्रकार, the callback can be called a long time after digitButton did its task and after the local variable digit went out of scope.