Método para ejecutar código cuando termina el script
Descripción
No es una función concreta, sino una forma acordada de aprovechar la recolección de basura de Lua para ejecutar código cuando el script termina (o es terminado).
Principio: define un objeto global (un valor de tipo tabla) y establece su finalizador (finalizer) como una función. Cuando termina la máquina virtual de Lua, se llaman los finalizadores de todos los objetos de Lua, incluido el que has definido. En Lua, el finalizador es el método metamágico __gc del objeto.
Ejemplo sencillo
-- palabras clave: devolución de llamada de terminación del script, devolución de llamada al finalizar el script
objeto = {}
setmetatable(objeto, {
__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: el código anterior utiliza las funciones sys.toast, sys.msleep y setmetatable, que no pertenecen a este capítulo.
Ejemplo de encapsulación completa
function atexit(callback) -- recibe una función; usa atexit(una función) para registrar una función que se ejecute al terminar el script. Se recomienda que no tarde demasiado
____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
-- puedes copiar el código anterior al principio de tu script; a continuación se muestra un ejemplo de uso
--
-- usar atexit para registrar una devolución de llamada de terminación
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: el código anterior utiliza las funciones sys.toast, sys.msleep y setmetatable, que no pertenecen a este capítulo.