2016-07-08 22 views
1

Ich entwickle gerade ein Spiel in Love2D und verwende eine OOP-Bibliothek, die als Mittelklasse bekannt ist. Unglücklicherweise hat die Mittelklasse standardmäßig keine Destruktoren, d. H. Etwas, was es mir erlaubt, ein Objekt zu zerstören. Ich speichere alle meine Objekte in einer Tabelle, damit ich sie durchlaufen und ihre Draw- und Update-Funktionen ausführen kann. In meinem Code möchte ich, dass das Objekt sich selbst entfernen kann. Ich habe versuchtSelbst entfernen in lua

self = nil 

, aber das funktioniert nicht! Wäre es möglich, den Schlüssel der Objekte in der Tabelle zu finden, ohne ihn zu durchforsten und dann einfach table.remove zu verwenden? Dies ist immer noch suboptimal, als ob es Referenzen in der Zukunft gäbe, die ich auch aus diesen Tabellen entfernen müsste. Wie kann dies erreicht werden?

+1

In der objektorientierten Programmierung löschen Sie normalerweise nie explizit ein Objekt (außer zum Zweck der Freigabe von Speicher in nicht-müllsammelbaren Sprachen). Was versuchen Sie zu erreichen, indem Sie das Objekt löschen? Möchtest du es aus der Spielwelt löschen? Wenn dem so ist, könnte Love2D irgendwo eine Funktion "aus der Spielwelt entfernen" haben. –

+1

Warum nicht 'table.remove' vom Objekt selbst verwenden? 'function myclass: destructor() für k, v in ipairs (allObjects) macht, wenn v == self dann table.remove (allObjects, k) self = nil return end ende ende. – user6245072

Antwort

2

Sie können Ihre Objekte in einer Tabelle speichern, die vom Objekt selbst indexiert wird: cache[obj] = obj. Dann, um das Objekt aus dem Spiel zu entfernen, müssen Sie nur cache[self] = nil tun und (vorausgesetzt, es gibt keine anderen Verweise auf dieses Objekt), wird es einige Zeit später Müll gesammelt werden. Wenn Sie andere Orte haben, die auf dieses Objekt verweisen, können Sie überprüfen, ob die Verwendung von "weak" tables für Ihren Anwendungsfall geeignet ist.

+0

Danke! Genau das wollte ich. Die schwache Referenzierung war perfekt für mein Projekt! –