2012-12-28 115 views
10

我遇到類問題。我得到了以下錯誤: 嘗試索引本地「自我」(無值) 當我調用下面的類的getter方法時。 Item.lua文件:嘗試索引本地「自我」(零值)

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

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

function Item:getInterval() 
    return self.interval 
end 

我打電話此getter函數是這樣的:

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

item = Item() 

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

這裏有什麼問題嗎?

親切的問候......

+0

在'test_item()'裏面調用'item:getInterval()'而不是'item.getInterval()'。 –

+0

可能會告訴這是什麼「classlib」。注意你在'class()'調用中有不匹配的引號(single或double)。而@OmriBarel可能應該發佈一個答案,而不是評論... :-) – PhiLho

+0

謝謝!他們有什麼區別? – zontragon

回答

21

在一般情況下,你應該:調用成員函數。

在Lua中,冒號(:)代表函數調用,提供self作爲第一個參數。

因此

A:foo() 

大致等於

A.foo(A) 

如果不指定在A.foo(),該函數的身體會嘗試引用self參數,也沒有既沒有明確也沒有含蓄地填充。

注意,如果你從調用它裏面的成員函數的self將已經可用:

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

所有這些信息,你會在任何好的書的Lua /教程找到。

0

obj的:方法只是syntactictal糖:

定義:

功能OBJ:方法(阿爾法)是等效的obj.method(個體,阿爾法)

執行:

OBJ:方法( 「someValue中」)是等效的obj.method(OBJ, 「someValue中」)問候

-1

變化:

assert_equal(1, item.getInterval()) 

到:

assert_equal(1, item:getInterval()) 

在Lua中,它是有些可笑的錯誤報告。從課堂角度來看,應使用self參數調用.getInterval()方法,而:getInterval()方法隱含包含self參數。語法錯誤應該在被調用點中標記,而不是getInterval()的定義體。

傳統上,雖然你誤解了一個方法,但它不是方法的錯,而是調用者。

+0

你的答案並沒有真正帶來任何新的信息,這是部分不正確的。 *語法錯誤應在被調用點中標記* - 它會是,但它不是語法錯誤。 'o.f()'仍然是有效的Lua代碼,它只是做一些不同於冒號調用的東西。 –

相關問題