2012-12-28 9 views
10

Ho un problema con le classi. Ho ricevuto l'errore seguente: Tentativo di indicizzare 'self' locale (valore nullo) Quando chiamo il metodo getter di sotto classe. Item.lua di file:Tentativo di indicizzare 'self' locale (valore nullo)

require "classlib" 
Item = class("Item") 

function Item:__init() 
    self.interval = 1 
end 

function Item:getInterval() 
    return self.interval 
end 

sto chiamando questa funzione getter in questo modo:

dofile("../src/item.lua") 

item = Item() 

function test_item() 
    assert_equal(1, item.getInterval()) 
end 

Qual è il problema?

Cordiali saluti ...

+0

Chiama 'item: getInterval()' invece di 'item.getInterval()' all'interno di 'test_item()'. –

+0

Potrebbe essere utile per dire cos'è questo "classlib". Si noti che le virgolette non corrispondenti (single vs. double) nella chiamata 'class()'. E probabilmente @OmriBarel dovrebbe pubblicare una risposta, invece di un commento ... :-) – PhiLho

+0

Grazie! Qual'è la differenza tra loro? – zontragon

risposta

21

In generale, è necessario chiamare le funzioni membro per :.

In Lua, due punti (:) rappresenta una chiamata di una funzione, fornendo self come primo parametro.

Così

A:foo() 

è approssimativamente uguale a

A.foo(A) 

Se non si specifica A come A.foo(), il corpo della funzione cercherà di riferimento self parametro, che non ha stato compilato né esplicitamente né implicitamente.

Si noti che se si chiama da all'interno della funzione membro, self saranno già disponibili:

-- inside foo() 
-- these two are analogous 
self:bar() 
self.bar(self) 

Tutte queste informazioni si trovano in ogni buon libro Lua/tutorial.

0

l'obj: metodo è solo zucchero syntactictal Per:

definizione:

funzione obj: metodo (alfa) è equivalente a obj.method (self, alfa)

esecuzione:

obj: il metodo ("someValue") è equivalente a obj.method (obj, "someValue") Saluti

-1

Cambio:

assert_equal(1, item.getInterval()) 

a:

assert_equal(1, item:getInterval()) 

In Lua, era un po 'ridicolo per la segnalazione degli errori. Dal punto di vista della classe, il metodo .getInterval() deve essere richiamato con un parametro self, mentre il metodo :getInterval() include implicitamente il parametro self. E l'errore di sintassi dovrebbe essere etichettato nel punto chiamato, non nel corpo della definizione di getInterval().

In modo tradizionale, mentre si eseguiva un metodo errato, non era colpa del metodo, ma del chiamante.

+0

La tua risposta in realtà non porta nuove informazioni, ed è parzialmente errata. * l'errore di sintassi dovrebbe essere etichettato nel punto chiamato * - lo sarebbe, ma non si tratta di un errore di sintassi. 'o.f()' è ancora valido codice Lua, fa solo qualcosa di diverso dalla chiamata due punti. –

Problemi correlati