我的课有问题。我得到以下错误: 尝试索引本地'self'(零值) 当我调用下面的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 :(得分:24)
通常,您应该通过:
调用成员函数。
在Lua中,冒号(:
)表示函数的调用,提供self
作为第一个参数。
因此
A:foo()
大致等于
A.foo(A)
如果未在A.foo()
中指定A,则函数体将尝试引用self
参数,该参数既未明确也未隐式填充。
请注意,如果您从成员函数的 中调用它,self
将可用:
-- inside foo()
-- these two are analogous
self:bar()
self.bar(self)
所有这些信息都可以在任何好的Lua书/教程中找到。
答案 1 :(得分:1)
obj:方法只是语法糖:
定义:
function obj:method(alpha)等同于obj.method(self,alpha)
执行:
obj:method(“somevalue”)等同于obj.method(obj,“somevalue”)问候
答案 2 :(得分:-1)
变化:
assert_equal(1, item.getInterval())
为:
assert_equal(1, item:getInterval())
在Lua中,错误报告有些荒谬。从类的角度来看,.getInterval()
方法应使用self
参数调用,而:getInterval()
方法隐式包含self
参数。语法错误应在被调用点标记,而不是getInterval()
的定义主体。
传统上,当你错误地调用一个方法时,它不是方法的错,而是调用者。