2016-12-13 2 views
1

Вот мой тестовый код:Как явным образом назвать lua gc?

mt={} 
myt={} 
setmetatable(myt, mt) 
mt.__gc=function()print("hello gc")end 
myt=nil 
collectgarbage() 

Но, когда я работает этот код, нет никаких сообщений печати.

Итак, я думаю, что в моем коде должно что-то не так.

Update:

mt.__gc=function()print("hello gc")end 
setmetatable(myt, mt) 

Установить __gc поле перед setmetatable бы решить вопрос (с помощью онлайн interpreter), но, когда выполнение того же кода через C API luaL_dofile в моей программе, __gc снова мертв.

И я также тестирую в своем автономном lua-интерпретаторе (lua 5.1.5), а «__gcc» тоже мертв.

Единственный рабочий штраф - interpreter, версия которого составляет 5.3.

Итак, я должен, вероятно, спросить, как я могу получить «__gc» для работы под моей версией 5.1?

+1

'__gc' metamethod должен быть в метатете, когда вы вызываете' setmetatable'. И, конечно, это работает только с Lua 5.2 – moteus

+0

'setmetatable ({}, {__gc = function() print (" hello gc ") end}) collectgarbage()' Протестировано на Lua 5.2 – moteus

+0

Спасибо большое @ moteus.BUT ПОЧЕМУ? Потому что, когда я устанавливаю другие элементы metatable после того, как я называю «setmetatable», все они работают нормально, например __index, некоторые функции, переменные ... Почему «GC» настолько особенный? Есть ли какие-либо официальные документы, рассказывающие об этом? – francis

ответ

1

Необходимо установить поле __gcдо по телефону setmetatable.

manual говорит:

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

Методы GC для таблиц были представлены в Lua 5.2. Они не работают в Lua 5.1.

+0

Да, я заметил это сейчас. Но, как я сказал в последнем комментарии выше, при запуске сценария lua через L API-интерфейс L API, GC не вызывается с тем же кодом выше. @ Lhf – francis

+0

@francis, вы проверили код возврата 'luaL_dofile'? Если это так, напишите свой C-код. – lhf

+0

Да, у меня есть.'luaL_dofile 'просто возвращает 0. Не произошла ошибка. Я видел, что вы отредактировали свой ответ. И затем я сравнил 5.1-й документ с 5.2. Вы правы, GC-метаметод можно использовать только для пользовательских данных в 5.1. @ Большое спасибо. @ Lhf – francis

 Смежные вопросы

  • Нет связанных вопросов^_^