Попытка индексировать локальное «я» (значение 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

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

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

10
nl ja de
Спасибо! В чем разница между ними?
добавлено автор zontragon, источник
Может быть полезно рассказать, что это за "classlib". Обратите внимание, что в вызове class() у вас есть unmatching quotes (single vs. double). И @OmriBarel должен, вероятно, опубликовать ответ, а не комментарий ... :-)
добавлено автор PhiLho, источник
Вызов item: getInterval() вместо item.getInterval() внутри test_item() .
добавлено автор Omri Barel, источник

4 ответы

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

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

таким образом

A:foo()

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

A.foo(A)

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

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

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

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

22
добавлено

Изменить:

assert_equal(1, item.getInterval())

чтобы:

assert_equal(1, item:getInterval())

В Lua это было немного смешно для сообщения об ошибках. С точки зрения класса метод .getInterval() должен вызываться с параметром self , тогда как метод : getInterval() неявно включен параметр self . И синтаксическая ошибка должна быть помечена в вызываемой точке, а не в определении тела getInterval() .

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

1
добавлено
Ваш ответ действительно не вносит никакой новой информации, и это частично неверно. ошибка синтаксиса должна быть помечена в вызываемой точке - это было бы, но это не синтаксическая ошибка. o.f() по-прежнему действует код Lua, он просто делает что-то отличное от вызова двоеточия.
добавлено автор Bartek Banachewicz, источник

Изменить:

assert_equal(1, item.getInterval())

чтобы:

assert_equal(1, item:getInterval())

В Lua это было немного смешно для сообщения об ошибках. С точки зрения класса метод .getInterval() должен вызываться с параметром self , тогда как метод : getInterval() неявно включен параметр self . И синтаксическая ошибка должна быть помечена в вызываемой точке, а не в определении тела getInterval() .

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

1
добавлено
Ваш ответ действительно не вносит никакой новой информации, и это частично неверно. ошибка синтаксиса должна быть помечена в вызываемой точке - это было бы, но это не синтаксическая ошибка. o.f() по-прежнему действует код Lua, он просто делает что-то отличное от вызова двоеточия.
добавлено автор Bartek Banachewicz, источник

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

определение:

Функция obj: метод (альфа) эквивалентен obj.method (self, alpha)

выполнение:

obj: method ("somevalue") эквивалентен obj.method (obj, "somevalue") С уважением

0
добавлено
pro.lua
pro.lua
411 участник(ов)

Правила: Тут можно обсуждать все, что связанно с луа-движки, интерпретаторы/компиляторы, питухан-биндинги, скрипты на сталкер и пр. Запрещена реклама! Срачи и оффтоп не желательны. За нарушение - бан github.com/rjpcomputing/luaforwindows Участник @ProDOT