Chạy mã khi tập lệnh bị chấm dứt
Mô tả
Đây không phải là một hàm cụ thể, mà là một mẫu tận dụng cơ chế thu gom rác của Lua để chạy mã khi tập lệnh kết thúc (hoặc bị chấm dứt).
Cách hoạt động: định nghĩa một đối tượng toàn cục (một bảng) và gắn hàm hoàn tất cho nó. Khi máy ảo Lua tắt, hàm hoàn tất của mọi đối tượng Lua (bao gồm đối tượng này) sẽ được gọi. Trong Lua, hàm hoàn tất là
__gcmetamethod của đối tượng.
Ví dụ tối thiểu
-- từ khóa: callback khi chấm dứt, khi thoát
SOME_VAR = {}
setmetatable(SOME_VAR, {
__gc = function(...)
sys.toast('Đã chấm dứt!')
sys.msleep(500)
end
})
--
while (true) do
sys.toast("Bạn có thể thử chấm dứt tập lệnh ngay bây giờ\n\n"..os.date("%Y-%m-%d %H:%M:%S"))
sys.msleep(1000)
end
Lưu ý: Sử dụng sys.toast, sys.msleep, setmetatable
Ví dụ trợ giúp đầy đủ
function atexit(callback) -- Đăng ký hàm chạy khi tập lệnh kết thúc; tránh thao tác kéo dài tại đây.
____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('Không đặt tên biến là `____atexit_guard____`.')
end
end
-- Sao chép phần trên vào đầu tập lệnh; cách dùng ở bên dưới
--
-- Đăng ký callback khi thoát
atexit(function()
sys.toast('Đã chấm dứt!')
sys.msleep(500)
end)
--
while (true) do
sys.toast("Bạn có thể thử chấm dứt tập lệnh ngay bây giờ\n\n"..os.date("%Y-%m-%d %H:%M:%S"))
sys.msleep(1000)
end
Lưu ý: Sử dụng sys.toast, sys.msleep, setmetatable