Из модуля C проще всего создать полный userdata
с metatable
с __gc
метаметодом.Сохраните его в поле в среде модуля, чтобы он не собирался ГХ до тех пор, пока модуль не будет выгружен.
Согласно руководству , только userdata
получают их __gc
Метаметод вызывается сборщиком, поэтому вы не можете использовать таблицу для хранения финализатора модуля.
Для модуля, написанного на чистом Lua, который нуждается в финализаторе, вам все равно нужно иметь userdata
для его хранения.вверх.Неподдерживаемая и недокументированная, но широко известная функция newproxy()
может быть использована для создания в противном случае пустого userdata
с метатаблицей, которую можно использовать для этой цели.Назовите его newproxy(true)
, чтобы получить метатабель, и используйте getmetatable()
, чтобы получить метатаб, чтобы к нему можно было добавить метаметод __gc
.