Я только начал свое приключение с Луа, и у меня возникли некоторые проблемы.
У меня есть таблица, в которой хранятся экземпляры объектов, которые используются в моем приложении.
Я делаю что-то с каждой записью, и когда я закончу, я хочу удалить ее из таблицы.
Скажем, сценарий такой:
создать 10 экземпляров и вставить их в таблицу
сделать некоторые вычисления для некоторых из них [случайный выбор]
после завершения расчета удалить запись из таблицы
тем временем добавить еще 10 экземпляров в таблицу
после 6-го расчета удалить все записи из таблицы
Поскольку я знаю, сколько объектов было добавлено с самого начала, я использую этот счетчик в качестве ключа записи:
table.insert(myTable, tostring(myObject.objectNumber), myObject)
Я использую tostring, чтобы убедиться, что у меня нет ключевых проблем [например, счет начинается с 0].
Я хотел удалить записи, используя:
table.remove(myTable, tostring(myObject.objectNumber))
Но это не ключ, который я должен передать в качестве второго аргумента, а позиция в таблице. Это порождает всю идею, и я немного растерялся из-за того, как правильно удалить запись, не делая циклический перебор таблицы каждый раз. Я не вижу ни одной функции, которая выдала бы мне позицию таблицы для ввода по ключу.
EDIT:
Так что проблема немного больше, чем я думал изначально.
Прежде всего:
table.insert(myTable, tostring(0), "something")
assert #myTable == 0
Я вижу это в своих журналах:
enemy count: 0
Inserting 0 table: 0x18e8a50
Insert check 0 table: 0x18e8a50
enemy count: 0
Inserting 1 table: 0x18c7c40
Insert check 1 table: 0x18c7c40
enemy count: 1
Также не возвращается ipairs ().
Я не уверен, почему, но это так.
Во-вторых,
Inserting 0 table: 0x1781ac60
Insert check 0 table: 0x1781ac60
Inserting 1 table: 0x5e8c20 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Insert check 1 table: 0x5e8c20 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Inserting 2 table: 0x17807390
Insert check 2 table: 0x17807390
Inserting 3 table: 0x5f5a30
Insert check 3 table: 0x5f5a30
Inserting 4 table: 0x18c7850
Insert check 4 table: 0x18c7850
Inserting 5 table: 0x5e15f0
Insert check 5 table: 0x5e15f0
Inserting 6 table: 0x1784c540
Insert check 6 table: 0x1784c540
Inserting 7 table: 0x5a7b80
Insert check 7 table: 0x5a7b80
Inserting 8 table: 0x18f6d30
Insert check 8 table: 0x18f6d30
Inserting 9 table: 0x189d3e0
Insert check 9 table: 0x189d3e0
remove 0 table: 0x1781ac60
remove check 0 nil 9
Inserting 10 table: 0x18e9c50
Insert check 10 table: 0x18e9c50
Inserting 11 table: 0x5d64a0
Insert check 11 table: 0x5d64a0
Inserting 12 table: 0x19d43540
Insert check 12 table: 0x19d43540
Inserting 13 table: 0x18d5730
Insert check 13 table: 0x18d5730
Inserting 14 table: 0x19d19110
Insert check 14 table: 0x19d19110
Inserting 15 table: 0x595800
Insert check 15 table: 0x595800
Inserting 16 table: 0x5e0f30
Insert check 16 table: 0x5e0f30
remove 5 table: 0x5e15f0
remove check 5 nil 16
remove 4 table: 0x18c7850
remove check 4 nil 16
remove 3 table: 0x5f5a30
remove check 3 nil 16
remove 2 table: 0x17807390
remove check 2 nil 16
remove 6 table: 0x1784c540
remove check 6 nil 16
remove 7 table: 0x5a7b80
remove check 7 nil 16
Inserting 17 table: 0x56fcf0
Insert check 17 table: 0x56fcf0
remove 1 table: 0x5e8c20 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
remove check 1 nil 17 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
remove 8 table: 0x18f6d30
remove check 8 nil 17
Inserting 18 table: 0x5970a0
Insert check 18 table: 0x5970a0
remove 9 table: 0x189d3e0
remove check 9 nil 18
Removing all entries:
1 table: 0x5e8c20 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
2 table: 0x17807390
3 table: 0x5f5a30
4 table: 0x18c7850
5 table: 0x5e15f0
6 table: 0x1784c540
7 table: 0x5a7b80
8 table: 0x18f6d30
9 table: 0x189d3e0
10 table: 0x18e9c50
11 table: 0x5d64a0
12 table: 0x19d43540
13 table: 0x18d5730
14 table: 0x19d19110
15 table: 0x595800
16 table: 0x5e0f30
17 table: 0x56fcf0
18 table: 0x5970a0
remove 1 table: 0x5e8c20 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Как видите, хотя я удалил запись ранее, она, похоже, все еще там.
Теперь ... Я думал, что это глобальная локальная проблема с таблицей, но я добавил количество записей в печать [последняя запись в удалении контрольных строк].
Список после «Удаление всех записей» был создан с использованием пар по циклу (myTable).
Вот код, куда я вставляю и удаляю записи:
MyObject = {}
MyObject_mt = { __index = MyObject }
function MyObject:new(params)
MyObject = {
objectNumber = params.objectNumber
}
local myObject = setmetatable(MyObject, MyObject_mt)
print("Inserting", tostring(myObject.objectNumber), tostring(myObject))
table.insert(myTable, tostring(myObject.objectNumber), myObject)
print("Insert check", tostring(myObject.objectNumber), tostring(myObject))
function MyObject:removeObject(event)
print("remove", self.objectNumber, tostring(self))
myTable[tostring(self.objectNumber)] = nil
print("remove check", self.objectNumber, tostring(myTable[self.objectNumber]), #myTable)
end
end
return myObject
end