2013-06-17 4 views
6

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

game_level_hints = game_level_hints or {} 
game_level_hints.levels = {} 
game_level_hints.levels["level0"] = function() 
    return 
    { 
     [on_scene("scene0")] = 
     { 
      talk("hint0"), 
      talk("hint1"), 
      talk("hint2") 
     }, 
     [on_scene("scene1")] = 
     { 
      talk("hint0"), 
      talk("hint1"), 
      talk("hint2") 
     } 
    } 
end 

समारोह परिभाषाओं Aaand:

यहाँ कैसे तालिका में परिभाषित किया गया है

function on_scene(sceneId) 
    -- some code 
    return sceneId 
end 

function talk(areaId) 
    -- some code 
    return areaId 
end 

संपादित करें:

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

+1

यह स्पष्ट नहीं है कि आप लूप में कैसे या क्या चाहते हैं। शायद आप समझ सकते हैं और छद्म कोड दे सकते हैं। बीटीडब्ल्यू-लुआ में पॉइंटर्स नहीं हैं। कार्य 'फ़ंक्शन' प्रकार के मान हैं और अभिव्यक्तियों में कहीं भी उपयोग किए जा सकते हैं। –

+0

@ टॉमब्लोडेट, यह इंगित करने के लिए धन्यवाद। मैंने इसे सही किया। – brain56

उत्तर

4

कार्य करें:

asd = game_level_hints.levels["level0"]() 

अब, asd में क्षेत्र स्ट्रिंग्स की आवश्यकता है। यह पसंद तक पहुँचने

asd[1][1] 

:: हालांकि आदर्श रूप में, मैं की तरह डेटा का उपयोग करने में सक्षम हो करने का इरादा

asd["scene0"][1] 

पुनः प्राप्त करने के क्षेत्र डेटा पर्याप्त होगा। मुझे बस चाबियों के आसपास काम करना होगा।

धन्यवाद, दोस्तों।

+0

आप शायद मेटाटेबल्स के साथ ऐसा कर सकते हैं, लेकिन यह शायद प्रयास के लायक नहीं है;) – dualed

1

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

मुझे लगता है कि आप on_scene और talk चाहते थे ताकि आपके game_level_hints तालिका में प्रत्येक स्तर का आह्वान करते समय कॉल किया जा सके।

local maxlevel = 99 
for i = 0, maxlevel do 
    game_level_hints.levels["level" .. i] = function() 
    on_scene("scene" .. i) 
    talk("hint" .. i) 
    end 
end 
-- ... 
for levelname, levelfunc in pairs(game_level_hints.levels) do 
    levelfunc() 
end 
6

लघु जवाब: एक समारोह (संदर्भ) एक सरणी में संग्रहीत कॉल करने के लिए, तो आप सिर्फ (parameters) जोड़ने के लिए, के रूप में आप आमतौर पर करते हैं:

यदि हां, तो यह कैसे आप यह कर सकते है

local function func(a,b,c) return a,b,c end 
local a = {myfunc = func} 
print(a.myfunc(3,4,5)) -- prints 3,4,5 

वास्तव में, आप

local a = {myfunc = function(a,b,c) return a,b,c end} 
print(a.myfunc(3,4,5)) -- prints 3,4,5 

लांग जवाब देने के लिए इस सरल बना सकते हैं: आप नहीं des करना रिश्वत दें कि आपके अपेक्षित परिणाम क्या हैं, लेकिन आपने जो लिखा है, वह करने के लिए नहीं है। इस टुकड़ा लें:

game_level_hints.levels["level0"] = function() 
    return 
    { 
     [on_scene("scene0")] = 
     { 
      talk("hint0"), 
     } 
    } 
end 

[इस पैरा नहीं रह गया है सवाल के बाद अद्यतन किया गया है पर लागू होता है] आप on_scene और talk कार्यों का संदर्भ है, लेकिन क्या आप के बाद से ऐसा नहीं "स्टोर" तालिका में उन कार्यों (स्पष्ट रूप से उन्हें आपके प्रश्न में संदर्भित किया गया है, मुझे लगता है कि प्रश्न इन फ़ंक्शंस) है। आप वास्तव में कॉल इन फ़ंक्शंस को कॉल करते हैं और उनके द्वारा लौटाए गए मानों को संग्रहीत करते हैं (वे दोनों nil लौटते हैं), इसलिए जब यह खंड निष्पादित किया जाता है, तो आपको nil को nil को इंडेक्स के रूप में स्टोर करने का प्रयास करने के दौरान "टेबल इंडेक्स शून्य" त्रुटि मिलती है।

आप समारोह आप game_level_hints.levels["level0"] में संग्रहीत कॉल करना चाहते हैं, तो आप सिर्फ का उपयोग करना क्या तुम लोगों के जवाब दिए और टिप्पणी की, मैं एक समाधान के रूप में निम्न कोड के साथ आने के लिए सक्षम था game_level_hints.levels["level0"]()

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