Ist es möglich, Destruktoren in Lua ohne userdata zu bekommen?
Ссылка sieht vielversprechend aus (genau das, was ich will); außer es ist ein Pfad für Lua 4.0.
Grundsätzlich möchte ich eine Möglichkeit haben, eine Funktion aufzurufen, wenn eine Tabelle gesammelt wird.
Danke!
Aus der Dokumentation zu Metatabellen :
Ein Metatable kann steuern, wie sich ein Objekt bei arithmetischen Operationen, Ordnungsvergleichen, Verkettung, Längenoperation und Indizierung verhält. Ein Metatable kann auch eine Funktion definieren, die aufgerufen wird, wenn ein Benutzerdatenträger als Garbage Collection erfasst wird.
In der Lua-FAQ der Lua-Benutzer heißt es:
Warum funktionieren die __gc und __len Metamethoden nicht an Tabellen?
Benutzerdatenobjekte erfordern häufig einen expliziten Destruktor, der ausgeführt wird, wenn das Objekt gelöscht wird, und Lua stellt zu diesem Zweck das
__gc
metamethod bereit. Dies ist jedoch aus Effizienzgründen nicht für Tabellen zulässig.Normalerweise muss kein Destruktor für eine Tabelle festgelegt werden, da die Tabelle automatisch gelöscht wird. Alle Referenzen, die die Tabelle enthält, werden dann normalerweise als Garbage Collected erfasst. Eine mögliche Problemumgehung besteht darin, eine Benutzerdaten zu erstellen. Machen Sie die Tabelle zur Umgebungstabelle der Benutzerdaten und platzieren Sie einen Verweis auf die Benutzerdaten in der Tabelle. (Stellen Sie sicher, dass dies der einzige Verweis auf die Benutzerdaten ist.) Wenn die Tabelle sammelbar wird, wird die% code% metamethode der Benutzerdaten ausgeführt; Lua wird die Tabelle nicht wirklich zerstören, bevor dies geschieht, da die Tabelle von den Benutzerdaten referenziert wird.
Sie müssen also Ihre Tabellen manuell in userdata umbrechen, wenn Sie das __gc
-Ereignis erhalten möchten.
Tags und Links lua destructor