2013-01-02 14 views
5

Sto cercando di modificare l'esempio di classe che ho trovato in this video per renderlo un po 'più semplice da usare. Spero che i miei commenti spieghino cosa sto cercando di ottenere abbastanza bene. Il problema che sto avendo è che quando provo ad usare la tabella dati mi dà questo errore: lua: class example.lua: 7: tentativo di indicizzare il campo 'data' (un valore nullo)Passaggio dell'array come parametro di funzione in Lua?

I'm supponendo che ciò significhi che l'array non viene passato correttamente nella funzione, ma non so perché. Sono molto alle prime armi con Lua.

Ecco quello che ho:

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

risposta

4

Se si desidera object per contenere i dati, probabilmente significava scrivere

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

invece di

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

In questo modo il risultato stampato è 64.

+0

Ah, è stato un errore così semplice ... anche se suppongo che di solito sia così. –

+0

Sì, e non insolito. Digitando 't.a' invece di' t [a] 'mi succede di tanto in tanto. – mkluwe

5

Non hai crea la tabella object.data - ogni tabella in Lua deve essere inizializzato:

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

o

local object = { data = {} } 

Tuttavia, l'esempio non funzionerà nel modo previsto, a meno che non si aggiorni la funzione getData:

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

Infine, questo è Lua, quindi non è necessario alcun ; nel codice: P.

+0

Haha, conosco il; non è necessario, ho appena iniziato a programmare con C, e il mio insegnante era molto severo riguardo a queste cose, quindi è confortante averle. : P –

+0

Quello che stavo facendo per iniziare con i lavori (meno lo stupido errore che ho fatto a mkluwe indicato) con meno codice di questo, e nessuna necessità di salvare la tabella dei dati una seconda volta. C'è qualche ragione per cui dovrei farlo in questo modo rispetto all'altro? –

2

Come gli altri hanno detto, object.data deve essere inizializzato e c'è un difetto nel ciclo for e getData. Inoltre, anche se non è un bug esatto, il tuo sistema di passare le chiavi come dispari e valori pari è un ottimo modo per farlo in un linguaggio basato su C, senza legami associativi/dizionario/tabella, ma in Lua, il linguaggio è

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

e, se la tabella si estende su più linee

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

Quindi nel tuo caso, monsterdata potrebbe essere semplicemente

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

ed è possibile rimuovere il ciclo for del tutto

nota: è possibile rappresentare solo le chiavi di stringa in questo modo. Per altri tipi di chiavi, come numeri, booleani o anche funzioni e altre tabelle, racchiudere la chiave in [ parentesi quadre ].Ad esempio, se si voleva un tavolo mynot, per mappare booleani ai loro opposti, è possibile utilizzare:

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

o, se si vuole mappare un insieme di funzioni ai loro libaries

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

I pensa che più impari a conoscere Lua più ti piacerà. È davvero un ottimo linguaggio, con molte piccole caratteristiche divertenti. Buona programmazione!

Problemi correlati