Lua - попытка индексировать локальный lvlObj (значение пользовательских данных)

Я начинающий программист, только начинаю с lua и Defold, и в основном у меня есть таблица с именем objects, а позже в коде я перебираю таблицу, используя пары методов, и в цикле for я пытаюсь получить доступ к элементу и использовать его, но я получаю сообщение об ошибке:

ERROR:SCRIPT: level/controller.script:57: attempt to index local 'lvlObj' (a userdata value)

В любом случае, мне было интересно, из-за чего возникла эта ошибка и как ее исправить. (pipe_reset - логическая переменная, не должна иметь ничего общего с ошибкой)

pipe_reset = false

local objects = {}

... позже в коде

if pipe_reset then
    for k in pairs(objects) do
        local lvlObj = objects [k]
        lvlObj.delete()
        objects [k] = nil
    end 
    pipe_reset = false
end

2 ответа

Решение

Вы получаете эту ошибку, потому что вы пытаетесь проиндексировать не индексируемый тип пользовательских данных.

Я понятия не имею о Defold, но я искал ссылку на API для функции delete(). Единственный, кого я нашел, был go.delete()

Поскольку вы не предоставляете достаточно информации, я могу только предположить, что вы хотите использовать эту функцию.

Пожалуйста, обратитесь к http://www.defold.com/ref/go/ за подробной информацией.

delete не является членом вашего типа объекта, но таблицы идут. Поэтому вам, скорее всего, придется вместо этого вызывать go.delete(). go.delete() принимает необязательный идентификатор. Также есть функция go.get_id().

Я думаю, вы можете сделать что-то вроде

local id = go.get_id(myFancyObject)
go.delete(id)

или, может быть, ваш объект уже является идентификатором? так

go.delete(myFancyObject)

может работать так же

Может быть, просто попробуйте в вашем примере:

for _, id in objects do
  go.delete(id)
end

Вы можете использовать "xy", только если x является таблицей (это эквивалентно x["y"]), что, очевидно, не является. Если предполагается, что это таблица с ключом "delete", я бы посмотрел, где эта таблица создана, или посмотрим, есть ли какие-либо не-табличные значения в объектах. Если это не так, я бы попробовал использовать table.remove() вместо.

Другие вопросы по тегам