【问题标题】:Attempt to index local 'self' (a nil value)尝试索引本地“自我”(零值)
【发布时间】:2012-12-13 16:27:02
【问题描述】:

我的课程有问题。我收到以下错误: 尝试索引本地“自我”(零值) 当我调用下面类的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

这里有什么问题?

亲切的问候...

【问题讨论】:

  • test_item() 中调用item:getInterval() 而不是item.getInterval()
  • 可能有助于判断这个“类库”是什么。请注意,class() 调用中有不匹配的引号(单引号和双引号)。 @OmriBarel 可能应该发布答案,而不是评论... :-)
  • 谢谢!它们有什么区别?

标签: lua


【解决方案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 书籍/教程中找到所有这些信息。

【讨论】:

    【解决方案2】:

    obj:method 只是语法糖:

    定义:

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

    执行:

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

    【讨论】:

      【解决方案3】:

      变化:

      assert_equal(1, item.getInterval())
      

      到:

      assert_equal(1, item:getInterval())
      

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

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

      【讨论】:

      • 您的回答并没有真正带来任何新信息,而且部分不正确。 语法错误应该在被调用点中标记 - 可以,但它不是语法错误。 o.f() 仍然是有效的 Lua 代码,它只是做了一些与冒号调用不同的事情。
      猜你喜欢
      • 1970-01-01
      • 2014-10-08
      • 2017-03-12
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      相关资源
      最近更新 更多