Destruktoren in Lua?

8

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!

    
anon 20.06.2010, 06:50
quelle

1 Antwort

12

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.

    
Mark Rushakoff 20.06.2010, 09:43
quelle

Tags und Links