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...