參考:
https://blog.csdn.net/cooclc/article/details/104825564
lua加載一個(gè)文件的方式可以有:dofile绸罗,loadfile以及 require。其中l(wèi)oadfile是只編譯不執(zhí)行啊犬,dofile和require是同時(shí)編譯和執(zhí)行剖效。而dofile和require的區(qū)別是dofile同一個(gè)文件每次都要加載嫉入,也就是說,dofile兩次返回來的是兩個(gè)不同的地址璧尸。而require同一個(gè)文件咒林,不管多少次都是都返回同一個(gè)地址,其原因是lua的地址緩存在了package.load()中爷光。所以效率比dofile要高許多垫竞,因而現(xiàn)在一般都是用require加載文件。
Lua熱更新的兩種實(shí)現(xiàn)方式
1. 簡(jiǎn)單版但是有缺陷
package.load("modelname") = nil
-- 修改modelname.lua的數(shù)據(jù)
require("modelname")
既然你有緩存瞎颗,我直接置為空不就好了嗎件甥?然后重新require一次把修改好的加進(jìn)來。這樣子做的話第二次require的數(shù)據(jù)可能是正確的哼拔,但是之前require過一次的數(shù)值卻仍然錯(cuò)誤引有,所以說程序除非在之前沒有加載過這個(gè)文件,否則得到的結(jié)果不完善倦逐。
2. 復(fù)雜版但是很有用
function reload_module(module_name)
local old_module = package.loaded[module_name] or {}
package.loaded[module_name] = nil
require (module_name)
local new_module = package.loaded[module_name]
for k, v in pairs(new_module) do
old_module[k] = v
end
--執(zhí)行到這里應(yīng)該已經(jīng)可以了
package.loaded[module_name] = old_module
return old_module
end
使用一個(gè)表存儲(chǔ)新修改后的所有數(shù)值譬正,然后循環(huán)賦值給舊的值,這樣就可以確保同一個(gè)舊地址也可以得到正確的數(shù)據(jù)檬姥。