Деструкторы в Луа? - PullRequest
       21

Деструкторы в Луа?

10 голосов
/ 20 июня 2010

Возможно ли получить деструкторы в Lua без использования пользовательских данных?

http://www.lua.org/notes/ltn006.html выглядит многообещающе (на самом деле именно то, что я хочу); за исключением того, что это путь для Lua 4.0.

По сути, я хочу, чтобы функция вызывалась при сборе таблицы.

Спасибо!

1 Ответ

14 голосов
/ 20 июня 2010

Из документации о метатаблицах :

Метатаблица может контролировать поведение объекта в арифметических операциях, сравнениях по порядку, объединении, операции длины и индексировании.Metatable также может определять функцию, которая будет вызываться, когда пользовательские данные собираются сборщиком мусора.

Часто задаваемые вопросы Lua Users Lua гласят:

Почему __gc и__len метаметоды работают с таблицами?

Объектам пользовательских данных часто требуется какой-то явный деструктор для запуска, когда объект собирается быть удаленным, и Lua предоставляет для этой цели метаметод __gc.Однако это не допускается для эффективности таблиц.

Обычно нет необходимости устанавливать деструктор для таблицы, поскольку таблица будет автоматически удалена, а любые ссылки, содержащиеся в таблице, будут собраны сборщиком мусора.обычно.Возможный обходной путь - создание пользовательских данных;сделайте таблицу таблицей окружения userdata и поместите ссылку на userdata в таблицу.(Убедитесь, что это единственная ссылка на пользовательские данные.) Когда таблица станет доступной для сбора, будет запущен метаметод __gc пользовательских данных;Lua на самом деле не уничтожит таблицу до того, как это произойдет, потому что на таблицу ссылаются userdata.

Итак, вы должны вручную обернуть таблицы в userdata, если хотите получить событие __gc.

...