メインコンテンツまでスキップ

スクリプト終了時にコードを実行する方法

説明

これは特定の関数ではなく、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 を使用しています