Como executar código quando o script é encerrado
Descrição
Isto não é uma função específica, mas uma forma convencional de usar o mecanismo de coleta de lixo do Lua para executar código quando o script termina (ou é encerrado).
Princípio: defina um objeto global (um valor do tipo tabela) e atribua uma função ao seu finalizador; quando a máquina virtual do Lua terminar, os finalizadores de todos os objetos Lua, incluindo o que você definiu, serão chamados. No Lua, o finalizador é o método metamágico __gc do objeto.
Exemplo simples
-- palavras-chave: callback de encerramento do script, callback de término do script
nome_de_variavel = {}
setmetatable(nome_de_variavel, {
__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
Nota: o código acima usa as funções sys.toast, sys.msleep e setmetatable, que não pertencem a este capítulo.
Exemplo completo encapsulado
function atexit(callback) -- recebe uma função; use atexit(uma função) para registrá-la e executá-la ao terminar o script; recomenda-se não demorar muito
____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
-- o código acima pode ser copiado para o início do seu script; abaixo está um exemplo de uso
--
-- registra um callback de encerramento usando 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
Nota: o código acima usa as funções sys.toast, sys.msleep e setmetatable, que não pertencem a este capítulo.