Из документации о метатаблицах :
Метатаблица может контролировать поведение объекта в арифметических операциях, сравнениях по порядку, объединении, операции длины и индексировании.Metatable также может определять функцию, которая будет вызываться, когда пользовательские данные собираются сборщиком мусора.
Часто задаваемые вопросы Lua Users Lua гласят:
Почему __gc и__len метаметоды работают с таблицами?
Объектам пользовательских данных часто требуется какой-то явный деструктор для запуска, когда объект собирается быть удаленным, и Lua предоставляет для этой цели метаметод __gc
.Однако это не допускается для эффективности таблиц.
Обычно нет необходимости устанавливать деструктор для таблицы, поскольку таблица будет автоматически удалена, а любые ссылки, содержащиеся в таблице, будут собраны сборщиком мусора.обычно.Возможный обходной путь - создание пользовательских данных;сделайте таблицу таблицей окружения userdata и поместите ссылку на userdata в таблицу.(Убедитесь, что это единственная ссылка на пользовательские данные.) Когда таблица станет доступной для сбора, будет запущен метаметод __gc
пользовательских данных;Lua на самом деле не уничтожит таблицу до того, как это произойдет, потому что на таблицу ссылаются userdata.
Итак, вы должны вручную обернуть таблицы в userdata, если хотите получить событие __gc
.