lua版本变化

694 词

从 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