尝试索引本地变量'self'(一个nil值)

我在使用类时遇到了问题。我得到了以下错误: 尝试对本地“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

问题出在哪里?

亲切的问候...

点赞
用户752976
用户752976

总的来说,你应该使用 : 调用成员函数。

在 Lua 中,冒号(:)表示调用函数,并将 self 作为第一个参数传递。

因此,

A:foo()

大致等于

A.foo(A)

如果你不像 A.foo()那样指定 A,那么函数体将试图引用未显式或隐式填充的 self 参数。

请注意,如果在成员函数内部调用,则 self 已经可用:

-- 在 foo() 中
-- 这两个语句是等价的
self:bar()
self.bar(self)

你可以在任何好的 Lua 书籍/教程中找到这些信息。

2012-12-28 12:46:37
用户1130744
用户1130744

obj:method 只是语法糖,相当于:

定义:

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

执行:

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

谢谢。

2012-12-29 09:42:30
用户342348
用户342348

将下面翻译成中文并且保留原本的 markdown 格式,

变更:

assert_equal(1, item.getInterval())

为:

assert_equal(1, item:getInterval())

在 Lua 中,错误报告有些荒谬。从类的角度来看,.getInterval() 方法应该使用 self 参数进行调用,而 :getInterval() 方法隐含地包含了 self 参数。而且语法错误应该标记在调用点上,而不是 getInterval() 的定义体中。

传统的做法是,如果你错误地调用了一个方法,那么问题并不在于方法本身,而在于调用它的代码。

2013-03-31 17:07:10