Lua5 1 公升級 Lua5 3 公升級 小結

2021-10-02 22:26:48 字數 2852 閱讀 7694

lua的版本差異確實是比較讓人頭疼的事情,之前在移動端一直採用android下使用luajit,ios下使用lua5.1。這次公升級到xlua(lua5.3版本)主要有兩方面的原因:一是ulua後續維護比價差,決定要公升級到xlua,另一方面是公司在上線檢查中提示禁止luajit的使用(一些crash無法解決),當然順便解決了bit、64位問題。

參考:5.1 到 5.2 、5.2 到 5.3 、雲風:lua 5.2 的細節改變

5.2中拋棄module,建議使用require進行載入, 可能是考慮到module定義對全域性表的汙染, 參考:抵制使用 module() 定義模組

解決方案:

通過luaconf.h.in中lua_compat_module巨集定義開啟相容支援

在lua中自定義,如下:

local base = _env

local modname = {}

local _env = modname

...return modname

在5.1版本,可以理解為每個chunk都具有自己的環境表,然後通過setfenv/getfenv進行設定和操作。lua5.2開始取消了環境表的概念,取消setfenv/getfenv方法,增加了_env來管理。

_env

-- lua 5.1 

function foobar()

setfenv(1, {})

-- code here

end

-- lua 5.2

function foobar()

local _env = {}

-- code here

end

_g 和 _env*

_g 是放在登錄檔lua_ridx_globals中,初始化時核心的庫都放在_g中;_env 是chunk閉包的第乙個upvalue,load時預設為_g, 然後後面定義的變數都會在編譯時加上_env.字首,以此傳遞下去,當然也可以修改。lua的登錄檔,_env,_g 底層實現從源**層級對二者之間的區別進行了討論。如果想要修改環境的同時還能訪問全域性變數

a = 1  

local newgt = ()

setmetatable(newgt, )

_env = newgt

print(a) --> 1

a = 10

print(a) --> 10

print(_g.a) --> 1

_g.a = 20

print(_g.a) --> 20

lua5.3 實現 setfenv/getfenv

5.2開始在debug 類中提供了一些列關於upvalue操作的函式,通過這個方法可以實現類似5.1中setfenv/getfenv的操作方式。詳細的過程可以參考 這兩篇文章:

implementing setfenv in lua 5.2, 5.3, and above

converting setfenv getfenv to lua 5.2

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

endi = i + 1

endendlocal 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

endi = i + 1

endreturn 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) \

#endif

lua5.3 預設支援64位整數和浮點數,當然也可以通過luaconf.h修改為32位。預設為64位之後徐需要注意的是:

從luajit公升級到5.3版本問題都比較零碎,除了上面幾個問題,還包括:

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不同版本間相容資源

mysql公升級 5 1公升級到5 7

一 mysql公升級 1.備份資料庫 mysqldump u root ppasswod all databases data bak db bak date y m d h m sql 同時可備份整個mysql目錄,包括data目錄,可用於公升級失敗快速回滾 2.安裝5.7 提供兩種安裝方式參考,...

MySQL公升級5 5 36公升級5 6 37

公升級的方法一般有兩類 1.利用mysqldump來直接匯出sql檔案,匯入到新庫中,這種方法是最省事兒的,也是最保險的,缺點的話,也顯而易見,大庫的mysqldump費時費力。2.直接替換掉mysql的安裝目錄和my.cnf,利用mysql upgrade 來完成系統表的公升級,這種方法需要備份原...

zabbix自帶php5 4公升級至7 2公升級步驟

公升級前備份 etc php.ini 1.解除安裝原來低版本的php rpm qa grep php xargs i rpm e nodeps2.更新yum源 rpm uvh rpm uvh 生成一些repo檔案在 etc yum.repos.d 目錄下 ls etc yum.repos.d epe...