스크립트가 종료될 때 코드를 실행하는 방법
설명
특정한 함수가 아니라 Lua의 가비지 컬렉션 메커니즘을 이용하여 스크립트가 끝나거나 종료될 때 코드를 실행하는 관례적인 작성 방식입니다.
원리: 전역 객체(테이블 값)를 정의하고 해당 객체의 finalizer를 함수로 설정합니다. Lua 가상 머신이 종료될 때 정의한 객체를 포함한 모든 Lua 객체의 finalizer가 호출됩니다. Lua에서 finalizer는 객체의 __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.toast, sys.msleep, setmetatable을 사용합니다.
완전한 래핑 예제
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.toast, sys.msleep, setmetatable을 사용합니다.