2013-01-02 16 views
5

Próbuję zmienić przykład klasy, który znalazłem w this video, aby uczynić go bardziej usprawnionym w użyciu. Mam nadzieję, że moje komentarze wyjaśniają, co staram się osiągnąć wystarczająco dobrze. Problem polega na tym, że gdy próbuję użyć tabeli danych, pojawia się następujący błąd: lua: class example.lua: 7: próba indeksowania pola "data" (wartość zerowa)Przekazywanie tablicy jako parametru funkcji w Lua?

Jestem zakładając, że oznacza to, że tablica nie jest poprawnie przekazywana do funkcji, ale nie wiem dlaczego. Jestem początkującym Lua.

Oto co mam:

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

Odpowiedz

4

Jeśli chcesz object do przechowywania danych, to prawdopodobnie oznaczało napisać

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

zamiast

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

Robi się to w wyniku drukowanej jest 64.

+0

Ach, to był taki prosty błąd ... choć przypuszczam, że tak się zwykle dzieje. –

+0

Tak, a nie niezbyt często. Wpisywanie 't.a' zamiast' t [a] 'zdarza mi się od czasu do czasu. – mkluwe

5

Nie utworzyć tabelę object.data - każda tabela w Lua musi zostać zainicjowany:

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

lub

local object = { data = {} } 

Jednak twój przykład nie zadziała w zamierzony sposób, chyba że naprawisz funkcję getData:

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

Wreszcie, to jest Lua, więc nie potrzebujesz żadnego ; w swoim kodzie: P.

+0

Haha, ja znam; nie jest to konieczne, zacząłem programować z C, a mój nauczyciel bardzo surowo o tych rzeczach, więc pocieszanie ich. : P –

+0

Co ja robiłem, aby zacząć od prac (bez głupiego błędu, który zrobiłem, który wskazał mkluwe) z mniejszym kodem niż to, i nie trzeba zapisywać tabeli danych po raz drugi. Czy jest jakikolwiek powód, dla którego powinienem to zrobić w ten sposób nad drugim? –

2

Podobnie jak inne powiedziane, object.data musi zostać zainicjalizowany, i jest luka w pętli for i getData. Ponadto, chociaż nie jest to dokładnie błąd, twój system przekazywania kluczy jako nieparzystych i wartości jako równy jest bardzo dobrym sposobem na zrobienie tego w języku opartym na C, bez tablic asocjatywnych/słownika/tabeli, ale w Lua, idiom jest

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

i, jeśli tabela obejmuje wiele linii

{ 
    keyname = value; 
    keyname = value; 
    keyname = value; 
    ... 
} 

Tak więc w Twoim przypadku, monsterdata może być po prostu

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

i można usunąć pętlę for w całości uwaga: w ten sposób można reprezentować tylko klucze łańcuchowe. W przypadku innych rodzajów kluczy, takich jak liczby, wartości logiczne, a nawet funkcje i inne tabele, otocz klucz w nawiasach kwadratowych [].Na przykład, jeśli chciałeś mynot tabelę, do mapowania wartości logicznych do ich przeciwieństwa, można użyć:

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

lub, jeśli chcesz mapować zestaw funkcji do ich bibliotekami

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

I im więcej się dowiadujesz o Lua, tym bardziej ci się spodoba. To naprawdę świetny język, z wieloma fajnymi funkcjami. Szczęśliwe kodowanie!

Powiązane problemy