-
Notifications
You must be signed in to change notification settings - Fork 55
Third party Lua lib_zh
首先你必须明白,Lua 脚本语言与其他常见的语言,例如 js, java, py 等都不同。其最大的区别在于 Lua 有着也许是世界上最小的标准库,小到甚至没有一个函数来获取当前的时间。也就意味着 lua 只能作为辅助的逻辑处理,而不能实现任何真正意义上的功能。 例如:网络访问、UI 绘制等都是不可能的。同时也不可能有任何一个纯 lua 库可以实现上述功能。
因此,lua 正确的使用方法是,根据自己的需求自行将需要的平台相关的函数注入到 lua 运行时里,例如通过把 java 的网络访问注入 lua 从而使得 lua 可以执行相关操作。注意这里的「注入」不同于常规跨语言中的「调用」。以 java 为例,通过 jni 可以调用 C 语言,但其本质上你依然在 java 层编码,调用的依然是 java 函数,只不过背后 java 帮你转到了 c 的实现。lua 则完全不同,通过注入实际上你是在进行「元编程」,你是在以一个上帝视角(lua 运行时)直接修改 lua 的运行环境。具体到 lua 中的表现就是,完全无法感知某个函数究竟是 lua 的标准库提供的,还是某个第三方模块提供的,还是由运行时注入的。
这样就造成了一个严重问题:大量的第三方使用了平台相关的 API 并注入到运行时。以 Android 程序类比:尽管 Android 应用是一个纯 java 程序,但是你不可能直接在 pc 的 java 环境中执行它,因为它需要 Android 环境。现在应该好理解了,能执行 lua 程序不代表能加载 lua 模块。再进一步举个例子:Node.js 是使用 js 编写的,但是你不能直接在浏览器中执行基于它开发的程序,因为 js 和 lua 有些类似,它也支持运行时注入函数,即元编程。
所以请放弃直接套用第三方 lua 库的想法,除非你能确定这个库是纯 lua 标准库实现的。