17

我的课程有问题。我得到以下错误:尝试索引本地“自我”(一个零值)当我调用下面类的getter方法时。项目.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

这里有什么问题?

亲切的问候...

4

3 回答 3

36

一般来说,你应该调用成员函数:

在 Lua 中,冒号 ( :) 表示函数的调用,self作为第一个参数提供。

因此

A:foo()

大致等于

A.foo(A)

如果您没有在 中指定 A A.foo(),则函数体将尝试引用self参数,该参数既未显式也未隐式填充。

请注意,如果您从成员函数内部self调用它,它将已经可用:

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

您可以在任何优秀的 Lua 书籍/教程中找到所有这些信息。

于 2012-12-28T12:46:37.877 回答
1

obj:method 只是语法糖:

定义:

函数 obj:method(alpha) 等价于 obj.method(self,alpha)

执行:

obj:method("somevalue") 等价于 obj.method(obj,"somevalue") 问候

于 2012-12-29T09:42:30.703 回答
-1

改变:

assert_equal(1, item.getInterval())

到:

assert_equal(1, item:getInterval())

在 Lua 中,错误报告有些荒谬。从类的角度来看,.getInterval()方法应该是带self参数调用的,而:getInterval()方法是隐式包含self参数的。并且语法错误应该标记在被调用点中,而不是getInterval().

在传统中,当你错误地调用了一个方法时,这不是方法的错,而是调用者的错。

于 2013-03-31T17:07:10.483 回答