Lua動態載入模組

2021-07-02 00:28:37 字數 1988 閱讀 3331

function reload( modulename )  

package.loaded[modulename] = nil

require(modulename)

end

使用以上**即可重新載入乙個檔案。

這樣修改完lua**後,可以不用重啟程式立刻生效。

模組a:

a = {}  

function a.test1()

print(1)

a.test2()

end

functin a.test2()

print(2)

end

模組main:

main=  

function main.setcallback()

main.callback = a.test1

end

function main.call()

main.callback()

end

main.setcallback()

呼叫main.call()輸出:

如果修改a為:

模組a:

a = {}  

function a.test1()

print(1)

print(3)

a.test2()

end

functin a.test2()

print(2)

print(4)

end

然後通過rpc或其他方法呼叫reload("a"),然後再呼叫main.call()輸出:

可以看到3沒有輸出。

也就是說 main.callback = a.test1 記錄的是老的a.test1,重新載入後呼叫的還是老的a.test1。所以沒有輸出3。

但是老的a.test1呼叫的a.test2,是直接呼叫而不是記錄的函式變數,動態得在全域性查詢函式名時查到的是新的a.test2了。所以輸出了4。

在重新載入乙個模組後,要注意其他地方有沒有儲存本模組的函式變數。

一般來說有rpc call函式名到函式的對映,還有timer等,這些callback都是記錄函式變數的。

下面乙個遠端客戶端輸入指令碼,傳到服務端由服務端的lua虛擬機器執行的**,主要是利用loadstring函式。

str引數就是輸入的指令碼,acc為當前session的唯一標誌,這裡是賬號名。

可以預先準備一些當前session固定的常用的變數,比如這裡c對應的就是玩家。客戶端在寫指令碼的時候可以直接使用這些變數。

在改變了某個模組a的**後,可以結合上面的reload(),在客戶端輸入 reload("a"),rpc呼叫服務端的debug.exec,更改的lua**可以即時生效。

function debug.exec(str, acc)  

if not isdebug() then

return false

end

local c = charactormanager.getobjbyaccname( acc )

if c == nil then return end

str = "local c = charactormanager.getobjbyaccname(/"" .. acc .."/")" .. str

print1(str)

local func = loadstring( str )

if func then

func(c)

print1("suc")

else

print1("fail")

end

end

lua模組載入

module mod name,package.seeall 函式 通過package.seeall選項可令舊全域性環境可見。require mod name 載入指定的模組。先檢測package.loaded表中是否存在modname,存在則直接返回當中的值,沒有則通重載入器載入modname。p...

lua的模組載入require

載入指定的模組。首先函式會在 package.loaded 這個表中檢視是否已經載入 了 modname 這個模組。如果是,那麼 require 會返回儲存在 package.loaded modname 的值。否則它將嘗 試去查詢乙個載入該模組的載入器。require 是由 package.sea...

nginx載入動態模組

不使用動態模組時 使用動態模組 不是所有的nginx模組都可以以動態模組方式加入nginx 載入方式參見nginx模組載入 需要注意的是 with http image filter module dynamic 如果採用動態模組的載入方式,那麼需要將 usr local src nginx 1.8...