Попытка индексировать локальное "я" (значение nil)

У меня проблема с классами. Я получил ошибку ниже: Попытка индексировать локальное "я" (значение nil) Когда я вызываю метод 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

В чем проблема?

С уважением...

Ответ 1

В общем, вы должны вызывать функции-члены :.

В Lua двоеточие (:) представляет собой вызов функции, предоставляя self в качестве первого параметра.

Таким образом,

A:foo()

Примерно равен

A.foo(A)

Если вы не укажете A, как в A.foo(), тело функции попытается ссылаться на параметр self, который не был заполнен ни явно, ни косвенно.

Обратите внимание, что если вы вызываете его изнутри функции-члена, self будет уже доступен:

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

Вся эта информация вы найдете в любой хорошей книге Lua/учебнике.

Ответ 2

метод obj: это просто синтактический сахар для:

:

Функция obj: метод (альфа) эквивалентен 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().

В традиционном, в то время как вы использовали метод, это был не метод, а вызывающий.