2016-07-08 3 views
1

В настоящее время я разрабатываю игру в Love2D и использую библиотеку ООП, известную как средний класс. К сожалению, средний класс по умолчанию не имеет деструкторов, то есть что-то, что позволяет мне уничтожить объект. Я сохраняю все свои объекты в таблице, чтобы я мог их пропустить и выполнить их функции Draw и Update. В моем коде я хочу, чтобы объект мог удалять себя. Я пробовалУдалить себя в lua

self = nil 

но это не работает! Можно ли узнать ключ объектов в таблице, не пробираясь через него, чтобы найти его, а затем просто использовать table.remove? Это все еще субоптимально, как если бы в будущем были ссылки, мне также пришлось бы удалить его из этих таблиц. Как это можно достичь?

+1

Обычно в объектно-ориентированном программировании вы никогда явно не удаляете объект (за исключением освобождения памяти, на языках, не связанных с мусором). Что вы пытаетесь выполнить, удалив объект? Вы хотите удалить его из игрового мира? Если это так, у Love2D есть функция «удалить из игрового мира». –

+1

Почему бы не использовать 'table.remove' из самого объекта? 'function myclass: destructor() для k, v в ipairs (allObjects), если v == self then table.remove (allObjects, k) self = nil return end end end'. – user6245072

ответ

2

Вы можете сохранить свои объекты в таблице, проиндексированной самим объектом: cache[obj] = obj. Затем, чтобы удалить объект из игры, вам просто нужно сделать cache[self] = nil и (при условии, что нет других ссылок на этот объект), это будет сбор мусора некоторое время спустя.

Если у вас есть другие места, которые ссылаются на этот объект, вы можете проверить, подходит ли использование "weak" tables для вашего прецедента.

+0

Спасибо! Это именно то, чего я хотел. Слабая ссылка была идеальной для моего проекта! –

Смежные вопросы