Zum Hauptinhalt springen

Code beim Beenden eines Skripts ausführen

Beschreibung

Dies ist keine konkrete Funktion, sondern eine vereinbarte Schreibweise, die den Lua-Speicherbereinigungsmechanismus nutzt, um beim Beenden (oder Abbrechen) eines Skripts Code auszuführen.

Prinzip: Ein globales Objekt (ein Tabellenwert) wird definiert und sein Finalizer auf eine Funktion gesetzt. Wenn die Lua-VM beendet wird, werden die Finalizer aller Lua-Objekte (einschließlich des definierten Objekts) aufgerufen. Ein Finalizer in Lua ist die __gc-Metamethode eines Objekts.

Einfaches Beispiel

-- Stichwörter: Skript-Beendigungs-Callback, Skript-Ende-Callback
beliebiger_variablenname = {}
setmetatable(beliebiger_variablenname, {
__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

Hinweis: Der obige Code verwendet die Funktionen sys.toast, sys.msleep und setmetatable aus anderen Kapiteln.

Vollständiges Kapselungsbeispiel

function atexit(callback) -- callback ist eine Funktion; mit atexit(eine Funktion) wird sie für die Ausführung beim Skriptende registriert. Die Ausführung sollte nicht zu lange dauern.
____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
-- Der obige Code kann an den Anfang des Skripts kopiert werden; anschließend folgt ein Verwendungsbeispiel.
--
-- Einen Beendigungs-Callback mit atexit registrieren
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

Hinweis: Der obige Code verwendet die Funktionen sys.toast, sys.msleep und setmetatable aus anderen Kapiteln.