Blitz Lua 对象接口 |
|
“对象接口”直接将 BlitzMAX 类型映射到相应的 Lua “类”,即一个带有关联元表的表。给定 BlitzMAX 模块的所有类型都驻留在一个 Lua 表中,该表的名称与底层模块相同:例如,在 Lua 中,BlitzMAX 类型 TGadget
(位于模块 BRL.MaxGUI
中)由 brl.maxgui.TGadget
复制(其中 brl
是一个全局表)。可选的“import
”机制使给定模块的所有类型都成为全局类型,从而无需使用模块名称作为前缀。
命名约定
由于 Lua 是一种区分大小写的语言(而 BlitzMAX 不是),因此以下命名约定适用
如有任何不确定性,请参考包中的类型引用。
参数处理和类型转换
Lua 函数参数等于相应 BlitzMAX 方法的参数,任何默认值都会得到正确尊重(即,相应的 Lua 参数可以是 nil
)。类型转换如下
boolean
”类型
string
”类型
此外,
值得注意的是:“函数接口”将 BlitzMAX 对象作为“轻量级用户数据”传递,而“对象接口”只使用 Lua “对象”。因此,接口实现了一种查找技术,以便为给定的 BlitzMax 对象检索 Lua 表,反之亦然。
_Peer
”的字段,该字段包含对底层 BlitzMAX 对象的“引用”(不要修改此字段!)。
因此,传递给 BlitzMAX 函数的是“_Peer
”,而从 BlitzMAX 返回的每个对象都会被查找并替换为其关联的 Lua 表(如果存在这样的表,否则会“动态”创建一个新的表)。
任何 BlitzMAX 常量也可以在定义模块所属的表中使用 - 它们的名称保持大写(例如 brl.event.EVENT_WINDOWCLOSE
),与 BlitzMAX 中一样。
对象接口的一些细节
接口“类”提供基于原型的差异继承(实际上这意味着,修改“类”会立即影响其所有实例,除非修改的字段被实例“遮蔽”)。此外,它们还管理其“_Peer
”的生命周期:使用“守护者”(参见 BlitzLuaKeeper),每个 Lua “对象”都会在垃圾收集器将其从内存中删除时收到通知。然后它会调用其 destroy
方法,该方法会正确关闭并删除关联的 BlitzMAX 对等体。
当同时使用“函数接口”和“对象接口”时,你不应该混合使用操作 BlitzMAX 对象的函数和 Lua “方法”,除非你真的知道自己在做什么。但是,使用其他函数(不处理特定对象)是安全的(而且通常是必要的)。
与“函数接口”相比,“对象接口”允许使用面向对象的表示法,并使程序员免于自己管理 BlitzMAX 对象的负担。
“对象接口”尚未完成,但有望在 2007 年 5 月 18 日左右发布。