Blitz Lua Keeper |
|
BlitzLua 是一个用 BlitzMAX 编写的 Lua 运行时环境,BlitzMAX 是一款快速跨平台 BASIC 编译器和运行时系统,适用于 Windows 98/ME/2000/XP、MacOS X 和 Linux。BlitzMAX 对象作为“轻量级用户数据”传递给 Lua,并使用函数(以底层对象作为其第一个参数)而不是“方法”进行操作。一个额外的层(在底层的“函数接口”之上)直接将任何 BlitzMAX 对象映射到相应的 Lua 表。通过“keeper”,这样的表可以在即将被 Lua 垃圾收集器移除时执行最终的“清理”操作(例如显式删除关联的 BlitzMAX 对象)。
“Keeper”实现了一种机制,该机制在 [Lua FaQ] 中被描述为对“为什么 __gc 元方法不适用于表?”这个问题的答案。
blitzmax.newKeeper(LuaTable)
会创建一个新的(完整)用户数据对象,该对象使用给定的 LuaTable
作为其环境
LuaTable
应该在其字段 "_Keeper"(以下划线开头,大写“K”)中存储对新“keeper”的引用
LuaTable
和“keeper”现在相互引用 - 并且 Lua 中不应该存在对“keeper”的其他引用。一旦 LuaTable
不再被除其“keeper”之外的其他对象引用,Lua 垃圾收集器就开始收集这两个对象
LuaTable
是否仍然使用用户数据对象作为其“keeper”(如果不是,则会静默中止)。之后,它会在 LuaTable
中查找一个名为“destroy”的字段(该字段应该包含一个 Lua 函数),并使用 LuaTable
作为其第一个也是唯一的参数调用它
析构函数现在可以执行清理 LuaTable
及其关联的 BlitzMAX 对象所需的任何操作。一旦析构函数完成(或失败),这两个对象将被 Lua 垃圾收集器移除。