2014-06-21 8 views
5

मेरे पास एक ऐसा फ़ंक्शन है जिसे मैं गतिशील रूप से जोड़ना चाहता हूं क्योंकि प्रोग्राम चलता है।कार्य करने के लिए संलग्न करें lua

function foo() 
    Function1() 
    Function2() 
    Function3() 
    Function4() 
end 

कार्यक्रम में बाद में:

मान लीजिए कि मैं समारोह फू करते हैं:

function foo() 
    Function1() 
    Function2() 
    Function3() 
end 

और मैं करने के लिए) फू (बदलना चाहते हैं। क्या इसे करने का कोई तरीका है?

उत्तर

7

बस इसे करें। आपके द्वारा लिखा गया कोड ठीक काम करता है। लूआ में कार्य वांछित के रूप में फिर से परिभाषित किया जा सकता है।

आप नहीं जानते कि क्या foo करता है, तो आप ऐसा कर सकते हैं:

do 
    local old = foo 
    foo = function() old() Function4() end 
end 

या शायद यह काम करता है की एक तालिका का उपयोग करने के स्पष्ट है:

local F={ Function1, Function2, Function3 } 

function foo() 
    for i=1,#F do F[i]() end 
end 

लैटर,

करना
F[#F+1]=Function4 

और आपको foo को फिर से परिभाषित करने की आवश्यकता नहीं है।

+0

'क्या' आवश्यक है? – Blauhirn

+0

@ ब्लौहिरन, सख्ती से नहीं, लेकिन यह उस ब्लॉक के लिए 'पुरानी' स्थानीय की परिभाषा रखता है। – lhf

0

यह पृष्ठभूमि की जानकारी के साथ एक पूरक उत्तर है।

लुआ पहचानकर्ता वैश्विक चर, स्थानीय चर, पैरामीटर और तालिका फ़ील्ड के लिए उपयोग किए जाते हैं। वे किसी भी प्रकार का मूल्य रखते हैं।

लुआ फ़ंक्शन मूल्य हैं। लूआ फ़ंक्शन सभी अज्ञात हैं, भले ही उन्हें परिभाषित करने के लिए उपयोग किए गए वाक्यविन्यास पर ध्यान दिए बिना।

function f() 
--... 
end 

एक लुआ स्टेटमेंट है जो फ़ंक्शन परिभाषा और एक चर के लिए असाइनमेंट को संकलित करता है। यह हर बार एक समारोह परिभाषा निष्पादित किया जाता है

f = function() 
--... 
end 

के लिए एक वैकल्पिक है, यह एक नया कार्य मूल्य है, जो तब किसी भी संबद्ध अभिव्यक्ति या काम में प्रयोग किया जाता है पैदा करता है।

यह स्पष्ट होना चाहिए कि न तो कथन आवश्यक रूप से एक नया चर बनाता है और न ही हमेशा एक ही मूल्य रखने की आवश्यकता होती है, न ही इसे हमेशा एक कार्य मूल्य रखने की आवश्यकता होती है। साथ ही, बनाए गए फ़ंक्शन मान को केवल एक चर द्वारा ही नहीं रखा जाना चाहिए। इसे किसी भी अन्य मूल्य की तरह कॉपी किया जा सकता है।

इसके अलावा, अन्य मूल्यों की तरह, फ़ंक्शन मान कचरा एकत्रित होते हैं। इसलिए, यदि f में फ़ंक्शन वैल्यू था और उसे एक अलग मान दिया गया है या दायरे से बाहर चला गया है (कहें, यदि यह वैश्विक चर नहीं था), तो पिछला मान कचरा इकट्ठा होगा जब कुछ भी इसका संदर्भ नहीं देता है।


function f() end के लिए किसी अन्य संदर्भ के बिना, हम यह मान लेगा कि f एक वैश्विक चर रहा है। लेकिन यह जरूरी नहीं है कि मामला। यदि f एक इन-स्कोप स्थानीय या पैरामीटर था, तो यह f है जिसे असाइन किया जाएगा।

संबंधित मुद्दे