跳至主要內容

腳本被終止時執行一些代碼的方法

說明

這不是一個具體的函式,而是利用 Lua 垃圾回收機制在腳本結束 (或被終止) 時執行一些代碼的約定寫法

原理:定義一個全域物件 (表型值),將其 終結器 (finalizer) 設為一個函式;當 Lua 虛擬機結束時,所有 Lua 物件(也包括你定義的這個)的 終結器 都會被呼叫。Lua 中的 終結器 即物件的 __gc 元方法

簡易範例

-- 關鍵詞 腳本終止回調 腳本結束回調
exit_guard = {}
setmetatable(exit_guard, {
__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.toastsys.msleepsetmetatable

完整封裝範例

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
-- 以上代碼可拷貝到你的腳本的開頭,以下為使用示例
--
-- 使用 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.toastsys.msleepsetmetatable