2013-01-02 37 views
5

मैं this video में प्राप्त क्लास उदाहरण को बदलने की कोशिश कर रहा हूं ताकि इसे उपयोग करने के लिए थोड़ा और सुव्यवस्थित बनाया जा सके। उम्मीद है कि मेरी टिप्पणियां बताती हैं कि मैं पर्याप्त रूप से पूरा करने की कोशिश कर रहा हूं। मेरी समस्या यह है कि जब मैं डेटा तालिका का उपयोग करने की कोशिश करता हूं तो यह मुझे यह त्रुटि देता है: lua: class example.lua: 7: फ़ील्ड 'डेटा' (एक शून्य मान) इंडेक्स करने का प्रयासलुआ में फ़ंक्शन पैरामीटर के रूप में सरणी पास करना?

मैं हूं यह मानते हुए कि इसका मतलब है कि सरणी को फ़ंक्शन में ठीक से पारित नहीं किया जा रहा है, लेकिन मुझे नहीं पता कि क्यों। मैं लुआ के साथ बहुत शुरुआत कर रहा हूँ।

यहाँ मैं क्या मिल गया है:

local enemy = {}; --enemy class table 

function enemy:New(data) 
    local object = {}; --table to store all of data within class 
    local len = # data --get length of passed table 
    for i = 1, len, 2 do --loop to input all data from passed table into object table 
    object.data[i] = data[i + 1]; 
    end 

    function object:getData(choice) --function that allows us to retrieve data from the class 
    return self[choice]; 
    end 

    return object; --return class data table so we can create objects using the class 
end 

local monsterdata = {"name", "monster", "x", 64, "y", 128, "hp", 4}; --table containing data of monster. keys are odd numbered, values to those keys are even numbered 
local monster = enemy:New(monsterdata); --create a object using the class 

local test = monster:getData("x"); --set variable to a value with the getData function 

print(test); 

उत्तर

4

आप object चाहते हैं डेटा रखने के लिए, तो आप शायद यह मुद्रित परिणाम कर

object.data[i] = data[i + 1]; 

के बजाय

object[data[i]] = data[i + 1]; 

लिखने के लिए होती 64 है।

+0

आह, यह इतनी सरल गलती थी ... हालांकि मुझे लगता है कि आमतौर पर यह मामला है। –

+0

हां, और असामान्य नहीं। 'टी [ए] के बजाय' t.a' टाइप करना समय-समय पर मेरे साथ होता है। – mkluwe

5

आप object.data तालिका का निर्माण नहीं किया - लुआ में हर तालिका प्रारंभ करने की आवश्यकता है:

local object = {} 
local object.data = {} 

या

local object = { data = {} } 

हालांकि, आपका उदाहरण इच्छित तरीके से काम नहीं करेगा, जब तक कि आप GetData फ़ंक्शन को ठीक न करें:

function object:getData(choice) 
    return self.data[choice] 
end 

अंत में, यह लुआ है, इसलिए आपको अपने कोड में ; की आवश्यकता नहीं है: पी।

+0

हाहा, मुझे पता है; जरूरी नहीं है, मैंने अभी सी के साथ प्रोग्रामिंग शुरू कर दी है, और मेरा शिक्षक इन चीजों के बारे में बहुत सख्त था, इसलिए उन्हें आराम करने में मदद मिल रही है। : पी –

+0

मैं काम से शुरू करने के लिए क्या कर रहा था (कम से कम बेवकूफ गलती जो मैंने mkluwe की ओर इशारा किया) कम कोड के साथ, और डेटा तालिका को दूसरी बार सहेजने की आवश्यकता नहीं है। क्या कोई कारण है कि मुझे इसे दूसरे तरीके से करना चाहिए? –

2

अन्य लोगों की तरह, object.data को प्रारंभ करने की आवश्यकता है, और for लूप और getData में कोई दोष है। साथ ही, जब यह बिल्कुल एक बग नहीं है, तो गुजरने वाली कुंजियों की प्रणाली को अजीब और मूल्यों के रूप में भी सी-आधारित भाषा में करने का एक बहुत अच्छा तरीका है, जिसमें कोई सहयोगी-सरणी/शब्दकोश/तालिका अक्षर नहीं है, लेकिन लुआ में, मुहावरा

{keyname = value, keyname = value, ...}

तालिका कई पंक्तियों

{ 
    keyname = value; 
    keyname = value; 
    keyname = value; 
    ... 
} 
अपने मामले में

तो दिखाती है, तो और,, monsterdata बस हो सकता है

{ 
    name = "monster"; 
    x = 64; 
    y = 128; 
    hp = 4; 
} 

और आप for लूप को पूरी तरह से

नोट हटा सकते हैं: आप केवल स्ट्रिंग कुंजी का प्रतिनिधित्व कर सकते हैं। अन्य प्रकार की चाबियों के लिए, जैसे संख्याएं, बूलियन, या यहां तक ​​कि फ़ंक्शंस और अन्य टेबल, [ स्क्वायर ब्रैकेट ] में कुंजी को घेरते हैं।उदाहरण के लिए, यदि आप एक mynot तालिका में उनके विपरीत करने के लिए बूलियन्स मैप करने के लिए चाहता था, आप इस्तेमाल कर सकते हैं:

{ 
    [true] = false; 
    [false] = true; 
} 

या, यदि आप

{ 
    [print] = "standard"; 
    [os.execute] = "standard os"; 
    [math.sin] = "standard math"; 
    [function() print "a user function" end] = "me!"; 
} 

मैं उनके libaries के कार्यों का एक सेट मैप करने के लिए करना चाहता था लगता है कि आप लुआ के बारे में जितना अधिक सीखेंगे उतना अधिक आप इसे पसंद करेंगे। यह बहुत ही मजेदार छोटी सुविधाओं के साथ वास्तव में एक महान भाषा है। हैप्पी कोडिंग!