Перейти к основному содержимому

Выполнение кода при завершении скрипта

Описание

Это не конкретная функция, а соглашение об использовании механизма сборки мусора Lua для выполнения кода при завершении (или принудительной остановке) скрипта.

Принцип: определите глобальный объект (значение-таблицу) и назначьте его финализатором (finalizer) функцию. При завершении виртуальной машины Lua будут вызваны финализаторы всех объектов Lua, включая определённый вами. В Lua финализатор — это метаметод __gc объекта.

Простой пример

-- Ключевые слова: callback при завершении скрипта, callback при остановке скрипта.
имя_переменной = {}
setmetatable(имя_переменной, {
__gc = function(...)
sys.toast('被终止了!')
sys.msleep(500)
end
})
--
while (true) do
sys.toast("现在可尝试手动结束脚本\n\n"..os.date("%Y-%m-%d %H:%M:%S"))
sys.msleep(1000)
end

Примечание: в приведённом коде используются функции из других глав: sys.toast, sys.msleep и setmetatable.

Пример полной обёртки

function atexit(callback) -- Принимает функцию; вызов atexit(функция) регистрирует её для выполнения при завершении скрипта. Не рекомендуется выполнять её слишком долго.
____atexit_guard____ = ____atexit_guard____ or {}
if type(____atexit_guard____) == 'table' then
if not getmetatable(____atexit_guard____) then
setmetatable(____atexit_guard____, {
__gc = function(self)
if type(self.callback) == 'function' then
pcall(self.callback)
end
end
})
end
____atexit_guard____.callback = callback
else
error('别用 `____atexit_guard____` 命名你的变量。')
end
end
-- Приведённый код можно скопировать в начало скрипта; ниже приведён пример использования.
--
-- Регистрирует callback завершения через atexit.
atexit(function()
sys.toast('被终止了!')
sys.msleep(500)
end)
--
while (true) do
sys.toast("现在可尝试手动结束脚本\n\n"..os.date("%Y-%m-%d %H:%M:%S"))
sys.msleep(1000)
end

Примечание: в приведённом коде используются функции из других глав: sys.toast, sys.msleep и setmetatable.