Как обрабатывать вставки и удаления из таблицы и все еще знать, какая запись какая? - PullRequest
0 голосов
/ 10 декабря 2011

Я только начал свое приключение с Луа, и у меня возникли некоторые проблемы.

У меня есть таблица, в которой хранятся экземпляры объектов, которые используются в моем приложении. Я делаю что-то с каждой записью, и когда я закончу, я хочу удалить ее из таблицы.

Скажем, сценарий такой:

  • создать 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

1 Ответ

2 голосов
/ 10 декабря 2011

Хорошо, если у вас нет последовательных номеров объектов (т.е. не использовать таблицу в качестве массива, а в качестве словаря), вы можете просто сделать

table[tostring(myObject.objectNumber)] = nil;

То есть, запись удалена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...