2012-11-16 19 views
6

lua_resume और lua_yield पर तर्क पारित करने का उद्देश्य क्या है?लुआ: lua_resume और lua_yield तर्क उद्देश्यों

मैं समझता हूं कि lua_resume के पहले कॉल पर तर्कों को फिर से शुरू होने वाले लुआ समारोह में पारित किया जाता है। यह समझ में आता है। हालांकि मैं उम्मीद करता हूं कि lua_resume के बाद की सभी कॉल कोरआउट के फ़ंक्शन में तर्कों को "अद्यतन" करेंगी। हालांकि यह मामला नहीं है।

lua_resume के लिए lua_resume के लिए तर्क पारित करने का उद्देश्य क्या है? क्या कोरूटाइन के तहत चल रहे लुआ फ़ंक्शन को lua_resume द्वारा पारित तर्कों तक पहुंच प्राप्त हो सकती है?

उत्तर

10

निकोल ने क्या कहा। तुम अब भी पहले resume कॉल से मूल्यों की रक्षा कर सकते अगर आप चाहते हैं:

do 
    local firstcall 
    function willyield(a) 
    firstcall = a 
    while a do 
     print(a, firstcall) 
     a = coroutine.yield() 
    end 
    end 
end 

local coro = coroutine.create(willyield) 
coroutine.resume(coro, 1) 
coroutine.resume(coro, 10) 
coroutine.resume(coro, 100) 
coroutine.resume(coro) 

प्रिंट होगा

1 1 
10 1 
100 1 
+0

मुझे लगता है कि यह सवाल का जवाब नहीं देता है।ओपी/सी एपीआई/फंक्शंस lua_resume() और lua_yield() के बारे में था, जिसमें मानक लाइब्रेरी 'coroutine.resume()' आदि से भिन्न अर्थशास्त्र है (उदाहरण के लिए, lua_resume तीन तर्क लेता है - उनमें से दो lua_State हैं ...) – BadZen

+0

मुझे लगता है कि यह पैरामीटर पास करने के उद्देश्य के बारे में सवाल का जवाब देता है और एक उदाहरण प्रदान करता है जो लुआ दुभाषिया होने का प्रयास करना आसान है। वास्तव में, ओपी ने निकोल के जवाब के तहत अपनी टिप्पणी में उतना ही कहा। यदि आपको लगता है कि आपके पास बेहतर है तो आप हमेशा अपना जवाब दे सकते हैं। –

+0

libs में coroutine ऑब्जेक्ट के बीच एक बड़ा अंतर है (उदाहरण के लिए lua_State encapsulates) और सी एपीआई का उपयोग करना। मेरे पास कोई बेहतर जवाब नहीं है, इसलिए मैंने विशेष रूप से सी एपीआई के बारे में पूछने के लिए एक और सवाल खोला। निकोल का जवाब और आपका यहां दोनों कोरआउट लाइब्रेरी ऑब्जेक्ट के बारे में बात करते हैं। कोड की लगभग 100 पंक्तियां हैं जो lua_ * API के संदर्भ में लागू होती हैं। यह स्पष्ट नहीं है, और दस्तावेज़ीकरण विस्तार से कम है। – BadZen

5

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

coroutine.yield()resume कॉल पर जारी किए गए तर्क लौटाते हैं जो कोरआउटिन जारी रखते हैं, ताकि उपज कॉल की साइट पैरामीटर को संभाल सके क्योंकि यह चाहती है। यह कोड को उपज करने वाले विशिष्ट कोड के साथ संवाद करने के लिए फिर से शुरू करने की अनुमति देता है। yield()resume से वापसी मान के रूप में अपने तर्कों को पास करता है, और resume अपने तर्कों को yield पर वापसी मान के रूप में पास करता है। यह संचार का मार्ग स्थापित करता है।

आप इसे किसी अन्य तरीके से नहीं कर सकते हैं। निश्चित रूप से उन तर्कों को संशोधित करके नहीं जो yield साइट से दिखाई नहीं दे सकते हैं। यह सरल, सुरुचिपूर्ण है, और समझ में आता है।

इसके अलावा, इसे किसी के मूल्य पर पोकिंग करने के लिए अत्यधिक कठोर माना जाता है। विशेष रूप से एक समारोह पहले से ही ऑपरेशन में। याद रखें: तर्क केवल मूल्यों से भरे स्थानीय चर हैं। उपयोगकर्ता को उन चरों की सामग्री को तब तक बदलने की उम्मीद नहीं करनी चाहिए जब तक कि यह स्वयं को परिवर्तित न करे। वे local चर के बाद, सभी हैं। उन्हें केवल स्थानीय रूप से बदला जा सकता है; इसके कारण नाम।

+0

धन्यवाद! तो स्पष्टीकरण के लिए, कोरआउट शुरू होने के बाद स्थानीय मूल्यों को बाहरी रूप से संशोधित नहीं किया जा सकता है? मुझे लगता है कि मुझे ग्लोबल वैरिएबल द्वारा कोरआउटिन के आंतरिक में संवाद करने की आवश्यकता होगी? उदाहरण के लिए मुझे एक गेम में "आस-पास की वस्तुओं" की गिनती हो सकती है, जहां कोरआउट को यह जानने की जरूरत है कि कितनी अन्य वस्तुएं दूरी के भीतर हैं। ऐसा करने के लिए मुझे पास की वस्तुओं की संख्या को स्टोर करने के लिए वैश्विक होना होगा? मैं उम्मीद कर रहा था कि ग्लोबल के साथ नेमस्पेस को रोकने से बचने के लिए मैं फिर से शुरू करने से ठीक पहले कोरआउटिन को मूल्यवान कर सकता हूं। – RandyGaul

+0

मूल्यों को संशोधित किया जा सकता है; आपको केवल कोरआउटine.इल्ड() को उसी वैरिएबल को कॉल करने की आवश्यकता है जिसे आपने मूल रूप से पैरामीटर के रूप में पारित किया है। उदाहरण के लिए मेरा जवाब देखें। –

+0

@RandyGaul: "* एक बार कोरआउट शुरू होने के बाद स्थानीय मानों को बाहरी रूप से संशोधित नहीं किया जा सकता है *" स्थानीय 'चर को बाहरी * अवधि * में संशोधित नहीं किया जा सकता है; coroutines विशेष नहीं हैं। यदि आप इस नंबर को पास करना चाहते हैं, तो उन्हें 'फिर से शुरू करने' के लिए पैरामीटर के रूप में पास करें और उन्हें 'उपज' से वापसी मूल्य के रूप में एकत्रित करें। जैसा कि मैंने कहा, यह आपके पास संचार इंटरफ़ेस है। –