2014-04-28 2 views
6

निम्नलिखित कोड का टुकड़ा में "एक मेज मूल्य कॉल करने के लिए प्रयास":Bizzare लुआ

for weight, item in itemlist do 
    weight_total=weight_total+weight 
end 

त्रुटि है कि स्निपेट में पहली पंक्ति पर "तालिका मूल्य कॉल करने के लिए प्रयास" खड़ी कर रहा है। क्यूं कर?

Itemlist वजन और तार के टेबल के एक मेज, इस तरह की तरह है:

local itemlist = { 
         {4,"weapon_pistol"}, 
         {2,"weapon_357"}, 
         ... 

कुछ भी नहीं है जहाँ तक मैं बता सकता हूँ बुलाया जा रहा है; यह त्रुटि क्यों आ रही है?

उत्तर

11

जेनेरिक for 3 तर्कों की अपेक्षा करता है: एक कॉल करने योग्य मूल्य, कुछ मूल्य जिसे बार-बार पारित किया जाता है, और कुंजी जहां पुनरावृत्ति शुरू हो जाएगी।
स्टॉक लूआ पहले कॉल पर जोड़े को कॉल नहीं करता है, अगर यह कॉल करने योग्य नहीं है, हालांकि कुछ डेरिवेटिव करते हैं।

इस प्रकार, आप ipairs(itemlist), pairs(itemlist), next, itemlist का उपयोग करना चाहिए या जो भी आप चाहते हैं (पिछले दो समान व्यवहार है, और जो सबसे डेरिवेटिव करते हैं)।

इटरेटर मूल्य अनुक्रम खोल ...

function awesome_next(t, k) 
    local k, v = next(t, k) 
    if not v then return end 
    return k, table.unpack(v) 
end 
for k, a, b, c, d in awesome_next, t do 
end 
+0

तो तय बयान होगा 'कश्मीर, वजन, जोड़ों में आइटम के लिए (itemlist) do'? – Schilcote

+0

'अगली' पास की गई तालिका से एक कुंजी-मूल्य-जोड़ी लौटाता है, इसलिए 'के लिए, वी जोड़ों (आइटमलिस्ट) में' की तरह। (अब मैं मान रहा हूं कि प्रत्येक मान 'v' में वजन और वस्तु है ...) वैसे भी, [मानक लुआ दस्तावेज़ीकरण (5.2)] (http://www.lua.org/manual/5.2/manual.html) है काफी आसानी से पचाने योग्य imho ... – Deduplicator

+0

प्रत्येक मान वी वजन और वस्तु युक्त एक और तालिका होगी। मैं दस्तावेज़ पढ़ूंगा। – Schilcote