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()
вместо.