Работает ли теперь метаметод Lua __gc для таблицы (Lua 5.2.1)?

Я был немного удивлен, потому что я читал ранее, что метаметод __gc вызывается только для пользовательских данных и никогда для таблиц. (LuaFAQ: почему метаметоды __gc и __len не работают с таблицами?)

Но недавно я попробовал это и обнаружил, что это действительно работает! Попробуйте этот код с Lua 5.2.1:

do
  local b = setmetatable({a = 1}, {__gc = function(self) print(self.a); end});
end
collectgarbage();

Но я нигде не могу найти список изменений для этого, поэтому я немного расстроен и боюсь его использовать.

Может быть, кто-то может подтвердить мое предположение? Или это недокументированное поведение? Лично мне было бы неплохо иметь штатный способ создания деструктора таблицы, и я буду рад, если мое наблюдение окажется верным.


person Seagull    schedule 31.12.2012    source источник
comment
lua.org/versions.html#5.2 — Lua 5.2 был выпущен 16 декабря 2011 г. , Его основные новые функции - [...] финализаторы для таблиц.   -  person PleaseStand    schedule 31.12.2012


Ответы (1)


Раздел Справочное руководство по Lua 5.2 2.5.1 указывает, что таблицы поддерживают метаметод __gc. В частности, говорится

Чтобы объект (таблица или пользовательские данные) был финализирован при сборе, вы должны пометить его для финализации. Вы помечаете объект для финализации, когда устанавливаете его метатаблицу, а в метатаблице есть поле, индексированное строкой "__gc".

В аналогичной документации в Справочном руководстве 5.1 говорится

Используя C API, вы можете установить метаметоды сборщика мусора для пользовательских данных.

Кажется довольно очевидным, что Lua 5.2 теперь явно поддерживает метаметод __gc для таблиц.

person Lily Ballard    schedule 31.12.2012
comment
Ой ну спасибо! Я должен внимательно прочитать ссылку. Где были мои глаза. Извините за глупый вопрос. - person Seagull; 31.12.2012