Lua的版本差别确实是比较让人头疼的事情,以前在移动端一直采用Android下使用LuaJit,Ios下使用Lua5.1。此次升级到Xlua(lua5.3版本)主要有两方面的缘由:一是ulua后续维护比价差,决定要升级到xlua,另外一方面是公司在上线检查中提示禁止Luajit的使用(一些Crash没法解决),固然顺便解决了bit、64位问题。html
参考:5.1 到 5.2 、5.2 到 5.3 、云风:Lua 5.2 的细节改变git
5.2中抛弃module,建议使用require进行加载, 多是考虑到Module定义对全局表的污染, 参考:抵制使用 module() 定义模块
解决方案:github
local base = _ENV local modname = {} local _ENV = modname ... return modname
在5.1版本,能够理解为每一个chunk都具备本身的环境表,而后经过setfenv/getfenv进行设置和操做。Lua5.2开始取消了环境表的概念,取消setfenv/getfenv方法,增长了_Env来管理。闭包
-- Lua 5.1 function foobar() setfenv(1, {}) -- code here end -- Lua 5.2 function foobar() local _ENV = {} -- code here end
_G 是放在注册表LUA_RIDX_GLOBALS中,初始化时核心的库都放在_G中;_Env 是chunk闭包的第一个upvalue,load时默认为_G, 而后后面定义的变量都会在编译时加上_ENV.前缀,以此传递下去,固然也能够修改。lua的注册表,_ENV,_G 底层实现从源代码层级对两者之间的区别进行了讨论。若是想要修改环境的同时还能访问全局变量dom
a = 1 local newgt = () setmetatable(newgt, {__index = _G}) _ENV = newgt print(a) --> 1 a = 10 print(a) --> 10 print(_G.a) --> 1 _G.a = 20 print(_G.a) --> 20
5.2开始在Debug 类中提供了一些列关于upvalue操做的函数,经过这个方法能够实现相似5.1中setfenv/getfenv的操做方式。详细的过程能够参考 这两篇文章:
Implementing setfenv in Lua 5.2, 5.3, and above
Converting setfenv getfenv to Lua 5.2ide
local function getfenv(fn) local i = 1 while true do local name, val = debug.getupvalue(fn, i) if name == "_ENV" then return val elseif not name then break end i = i + 1 end end local function setfenv(fn, env) local i = 1 while true do local name = debug.getupvalue(fn, i) if name == "_ENV" then debug.upvaluejoin(fn, i, (function() return env end), 1) break elseif not name then break end i = i + 1 end return fn end
在5.2中已经移除了LUA_GLOBALSINDEX,去而带之的是注册表。5.2之后中上面两个函数都是使用的注册标中的LUA_RIDX_GLOBAS伪索引(索引注册表的全局环境)。处理 lua和C交互API的时候须要注意函数
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
Lua5.3 默认支持64位整数和浮点数,固然也能够经过luaconf.h修改成32位。默认为64位以后徐须要注意的是:ui
从luajit升级到5.3版本问题都比较零碎,除了上面几个问题,还包括:lua
github上也能够找到一些实现好的类库来知足不一样版本之间的兼容,好比:Lua向下兼容github 库、Lua不一样版本间兼容资源
lua的注册表,_ENV,_G 底层实现
抵制使用 module() 定义模块
云风 lua 5.2 的 _ENV
对lua中_ENV表的理解
Env环境
Implementing setfenv in Lua 5.2, 5.3, and above
Converting setfenv getfenv to Lua 5.2
Lua向下兼容github 库
Lua不一样版本间兼容资源