В настоящее время я столкнулся с проблемой, что вы не можете использовать метод __gc
для таблиц в Lua 5.1, поскольку они реализованы в Lua 5.2. Тем не менее, я хочу выпустить выделенные ресурсы, как только таблица lua будет собрана. Можно ли сделать обходное решение, которое дает мне функциональность __gc
metamethod в Lua 5.2 для Lua 5.1?Обходное решение Lua 5.1 для метаданных __gc для таблиц
ответ
В lua 5.1 единственные значения lua, которые работают с __gc
metamethod, равны userdata
. Естественно, любой хак или обходное решение должно будет включать в себя userdata
. Обычно нет способа просто создать newuserdata со стороны lua, но есть одна «скрытая» недокументированная функция newproxy
для этого.
newproxy
принимает необязательный параметр bool или userdata. Если вы перейдете в true
, тогда вы получите данные пользователя с новым присоединенным метатетом. Если вы передаете в другом userdata
то новый UserData будет назначен тот же метатаблицу, как один принятый в
Итак, теперь вы можете просто взломать вместе функцию, которая будет делать __gc
работу по таблицам:.
function setmt__gc(t, mt)
local prox = newproxy(true)
getmetatable(prox).__gc = function() mt.__gc(t) end
t[prox] = true
return setmetatable(t, mt)
end
И быстрый тест, чтобы подтвердить поведение:
iscollected = false
function gctest(self)
iscollected = true
print("cleaning up:", self)
end
test = setmt__gc({}, {__gc = gctest})
collectgarbage()
assert(not iscollected)
test = nil
collectgarbage()
assert(iscollected)
Обратите внимание, что Lua 5.2+ и позже уже не имеют newproxy
, так как __gc
официально поддерживается на столах.
При использовании предлагаемого решения есть одна вещь - если вы пройдете по таблице по парам(), вы получите один ключ добавления. Возможно, избежать этого, используя прокси-объект с правильными метаметками вместо исходной таблицы. –
Что вы подразумеваете под этим? – Turakar
- 1. __gc метод для malloced userdata в lua?
- 2. Обходное решение для UnsupportedAudioFileException?
- 3. Обходное обходное решение IE8
- 4. Обходное решение ColorAnimation для DynamicResource
- 5. Обходное решение для блокировки async?
- 6. Обходное решение для ошибки SSL
- 7. Обходное решение для Android ant?
- 8. Обходное решение для определения разрешения для Android
- 9. Обходное решение для отсутствия события TouchUp UIBarButtonItem
- 10. Обходное решение PHP API для приложения?
- 11. Мне нужно обходное решение jQuery.history для обновления
- 12. Обходное решение HTMLBody для объекта OlAppointment?
- 13. Обходное решение для дженериков со статическими методами
- 14. Обходное решение для статического наследования элементов
- 15. Обходное решение python для циклического импорта
- 16. PHP - Обходное решение типа данных для $ _POST
- 17. Обходное решение для не может переопределить?
- 18. Обходное решение для ICS «фиксирующая поверхность» -error
- 19. Обходное решение System.IO.Path.GetPathRoot для путей UNC
- 20. Обходное решение для безопасного соединения JSONP
- 21. Нужно обходное решение для & in url, iis7
- 22. Excel VBA для Mac: Обходное решение ComboBox
- 23. Обходное решение для генериков в Entity Framework
- 24. Обходное решение для глобального ключевого слова PHP
- 25. Ищет обходное решение для ошибки IE4 opacity
- 26. Обходное решение Perforce для добавления файлов с '@'
- 27. Идеальное переадресационное обходное решение для бит-полей
- 28. Обходное решение для увеличения масштаба диаграммы?
- 29. Обходное решение для DELETE ... Предложение LIMIT (SQL)
- 30. Обходное решение для Entity Framework Context.Refresh bug?
Используйте прокси-объект в таблице и поставьте на него метаметод '__gc'. Когда таблица будет собрана, прокси-сервер затем будет собран и будет вызываться метод '__gc'. Хотя это может потребовать дополнительных циклов gc. –