2016-04-21 63 views
0

我是Lua的新手,但不是編程。我過去廣泛使用Java。我決定學習Lua的最佳方式是做一些閱讀。我決定實現一個非常基本的面向對象版本,並做了如下工作:爲什麼我不能在表中使用「名稱」來訪問lua函數

Object = { 
    class = "object"; 
} 

function Object:getClass() 
     return self.class; 
    end 

function Object:printClass() 
     print(self:getClass()); 
    end 

print(Object:getClass()); --Returns "object" 
print(Object["getClass"); --Returns the memory address of the function getClass() 
print(Object["getClass"]()); --Should print the results of the function. Instead throws error "input:6: attempt to index a nill value (local self)" which, if I am understanding correctly, is the equivalent of a NullPointerException in Java. 

爲什麼Lua會拋出上面的錯誤?我究竟做錯了什麼?是否可以使用字符串「name」訪問函數?問題是不是關於如何以面向對象的方式使用Lua,已經回答here

我測試了代碼here

回答

4

因爲在Lua中,Object:getClass()是句法糖Object.getClass(Object)(如果您想獲得技術,它只會評估表達式Object一次)。因此,當您撥打Object["getClass"]()時,您正在調用沒有參數的功能。當函數試圖訪問它的第一個參數時,會導致一個問題:self,這將是nil

因此,錯誤,「嘗試索引零值(本地自我)」。

這也是魔法變量self的來源。當您用:聲明函數時,語法糖會在參數列表的前面添加一個參數,它將其稱爲self

+1

所以'Object [「getClass」](Object)'會工作,但會評估Object'兩次(通常不是問題,但可能是)。 –

相關問題