脚本被终止时执行一些代码的方法

说明

这不是一个函数
而是利用 Lua 的垃圾回收机制实现的,用于在脚本结束 (或被结束) 时执行一些代码的方法

原理 :定义一个全局对象 (表型值) ,将其 析构函数 设为一个函数,当 Lua 虚拟机结束之时,所有 Lua 对象 (也包括你定义的这个) 的 析构函数 会被调用。Lua 中的 析构函数 是指对象的 __gc 元方法

简易示例

-- 关键词 脚本终止回调 脚本结束回调
随便取个变量名 = {}
setmetatable(随便取个变量名, {
    __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

results matching ""

    No results matching ""