2013-01-02 38 views
5

Ben biraz daha akıcı kullanımı yapmak Ben this video bulunan sınıf örneğini değiştirmeye çalışıyorum. Umarım yorumlarım yeterince iyi bir şekilde başarmaya çalıştığımı açıklar. Sorun şu ki veri tablosunu kullanmaya çalıştığımda bana bu hatayı veriyor: lua: class example.lua: 7: alan 'indeks' indeksleme girişimi (bir nil değer)Diziyi Lua'da işlev parametresi olarak geçirme?

Bunun, dizinin fonksiyona düzgün bir şekilde aktarılmadığı anlamına geldiğini varsayardım, ama nedenini bilmiyorum. Lua ile çok yeni başladım. İşte

bende ne var:

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); 

cevap

4

, muhtemelen baskılı bu sonuçla yapmak

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

yerine

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

ait yazmak istedim olduğunu.

+0

Ah, öyle basit bir hataydı ki ... ... sanırım bu genelde geçerli. –

+0

Evet, ve nadir olmayan bir değil. T [a] 'yerine 't.a' yazarak zaman zaman bana olur. – mkluwe

5

Sen object.data tablo yaratmadı - Lua her tablo başlatılması gerekir:

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

veya

local object = { data = {} } 
Eğer getData işlevini düzeltmek sürece

Ancak, örnek, amaçlanan şekilde çalışmaz:

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

Son olarak, bu Lua'dır, bu nedenle kodunuzda ; koduna ihtiyacınız yoktur: P. 64 Eğer verileri tutmak için object istiyorsanız

+0

Haha, biliyorum ki; gerekli değil, C ile programlama yapmaya başladım ve öğretmenim bu şeylerle ilgili çok katıydı, bu yüzden onlara sahip olmak çok rahatlatıcı. : P –

+0

Ben daha az kod ile işleri ile çalışmaya başlamak için yaptığım (eksi aptalca hata yaptım) ve veri tablosunu ikinci kez kaydetmeye gerek yok. Bunu diğer tarafa yapmamın bir sebebi var mı? –

2

Diğerleri gibi, object.data'un başlatılması gerektiğini ve for döngüsünde ve getData bir kusuru olduğunu söyledi. Ayrıca, bir böcek değil iken tam senin bile bir C-merkezli dilde bunu yapmak için çok iyi bir yol olduğu gibi hiçbir ilişkisel dizi/Sözlük/masa değişmezleri ile, garip anahtarlar ve değerler geçme sistemi, ancak Lua, tablo birden fazla satır

sizin durumunuzda Yani
{ 
    keyname = value; 
    keyname = value; 
    keyname = value; 
    ... 
} 

yayılıyorsa deyim vardır

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

ve monsterdata basitçe olabilir

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

ve for döngü tamamen

notu silmek olabilir: bu yolla yalnızca dize anahtarlarını temsil edebilir. tuşların diğer tür, sayıların, Boolean, hatta fonksiyonları ve diğer tablolar gibi, [ köşeli parantez ] anahtarı çevreler.Onların kütüphanelerine

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

I işlevler kümesi haritasına istiyorsa,

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

ya: onların karşıtların için boole eşleştirmek için bir mynot tablo, isterse Örneğin, şunu kullanabilirsiniz Lua hakkında ne kadar çok şey öğrenirseniz o kadar çok seversiniz. Gerçekten çok eğlenceli küçük özelliklere sahip harika bir dil. Mutlu kodlar!

İlgili konular