lua版本变化
从 Lua 5.1 迁移到 5.2
5.2中抛弃module,建议使用require进行加载, 可能是考虑到Module定义对全局表的污染
在5.1版本,可以理解为每个chunk都具有自己的环境表,然后通过setfenv/getfenv进行设置和操作。Lua5.2开始取消了环境表的概念,取消setfenv/getfenv方法,增加了_Env来管理。
_G 和 _Env*
_G 是放在注册表LUA_RIDX_GLOBALS中,初始化时核心的库都放在_G中;_Env 是chunk闭包的第一个upvalue,load时默认为_G, 然后后面定义的变量都会在编译时加上_ENV.前缀,以此传递下去,当然也可以修改
- 全局注册表
在5.2中已经移除了LUA_GLOBALSINDEX,去而带之的是注册表。5.2以后中上面两个函数都是使用的注册标中的LUA_RIDX_GLOBAS伪索引(索引注册表的全局环境)。处理 lua和C交互API的时候需要注意
- luaL_register
Lua5.2 以后取消了这个接口,不过可以通过luaL_setfunc方法看来实现
#undef luaL_register #define luaL_register(L,n,f) { if ((n) == NULL) luaL_setfuncs(L,f,0); else luaL_newlib(L,f); } #endif
从 Lua 5.2 迁移到 5.3
- 整数 (默认 64 位),32 位整数的官方支持
- 位操作符
- 基本的 utf-8 支持
- 值的打包及解包函数
- 整数除法
- ipairs 以及表处理库都会考虑元方法
- 新函数 string.pack
- 新函数 string.unpack
- 新函数 string.packsize