Попытка индексировать локальное "я" (значение 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()
.
В традиционном, в то время как вы использовали метод, это был не метод, а вызывающий.