首页 文章

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

提问于
浏览
11

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

  • 1

    通常,您应该通过 : 调用成员函数 .

    在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

    obj:方法只是语法糖:

    定义:

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

    执行:

    obj:method(“somevalue”)相当于obj.method(obj,“somevalue”)问候

  • 23

    更改:

    assert_equal(1, item.getInterval())
    

    至:

    assert_equal(1, item:getInterval())
    

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

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

相关问题