我是Lua的新手,但不是编程。我过去曾经广泛使用过Java。我决定学习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。
答案 0 :(得分:4)
因为在Lua中,Object:getClass()
是Object.getClass(Object)
的语法糖(如果你想获得技术,它只评估表达式Object
一次)。因此,当您调用Object["getClass"]()
时,您正在调用没有参数的函数。当函数尝试访问其第一个参数时,这将导致问题:self
,这将是nil
。
因此错误,"尝试索引零值(本地自我)"。
这也是魔术变量self
的来源。当您使用:
声明函数时,语法糖会在参数列表的前面添加一个参数,并将其调用self
。