Exécuter du code lorsque le script est terminé
Description
Il ne s’agit pas d’une fonction précise, mais d’une convention qui utilise le ramasse-miettes de Lua pour exécuter du code lorsque le script se termine (ou est interrompu).
Principe : définissez un objet global (une valeur de type table) et attribuez une fonction à son finaliseur ; lorsque la machine virtuelle Lua se termine, les finaliseurs de tous les objets Lua, y compris celui que vous avez défini, sont appelés. Dans Lua, le finaliseur est la méthode __gc de l’objet.
Exemple simple
-- Mots-clés : rappel de terminaison du script, rappel de fin du script
nom_de_variable_quelconque = {}
setmetatable(nom_de_variable_quelconque, {
__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
Remarque : le code ci-dessus utilise les fonctions hors de ce chapitre sys.toast, sys.msleep et setmetatable.
Exemple complet encapsulé
function atexit(callback) -- Prend une fonction et l’enregistre pour l’exécuter à la fin du script ; il est recommandé qu’elle reste rapide.
____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
-- Vous pouvez copier ce code au début de votre script ; l’exemple d’utilisation suit.
--
-- Enregistre un rappel de terminaison avec 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
Remarque : le code ci-dessus utilise les fonctions hors de ce chapitre sys.toast, sys.msleep et setmetatable.