尝试索引本地'self'(零值)

时间:2012-12-28 11:39:27

标签: lua

我的课有问题。我得到以下错误: 尝试索引本地'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

这里有什么问题?

亲切的问候......

3 个答案:

答案 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()的定义主体。

传统上,当你错误地调用一个方法时,它不是方法的错,而是调用者。