lua裡實現類似巨集定義,動態生成程式碼
阿新 • • 發佈:2018-11-03
其實就是用了 lua 的 loadstring 功能。
1.把需要動態生成的程式碼拼接成為一個字串。 str
2. loadstring(str)
這個只是解析了程式碼,相當於一個function 需要 執行一下才會生效
所以一般寫成 loadstring(str) ()
或者 local proc = loadstring(str)
proc()
自己封裝一個類似巨集的函式, 我這裡是定義了一個 register_msg 用來處理接收到的 協議 統一打印出來。
local code = "" local function register_msg(msgname) code = code.."\n".."local function PrintMsg_"..msgname.."(msg)\n local decode = protobuf.decode(\"protos.rep_"..msgname.."\", msg:GetBodyInLua())\n print(\"recv msg(\"..msg.MsgType..\") "..msgname.."\")\n protobuf.print_message_s(decode)\n end\n NetProcessorRegister.RegisterProcessor(E_PROTOCOL."..msgname..", PrintMsg_"..msgname..");" end register_msg("E_C2S_GET_SERVER_LIST") register_msg("E_C2S_GET_GAME_ANN") loadstring(code)()
code 其實類似這樣一段程式碼
local function PrintMsg_E_C2S_GET_SERVER_LIST(msg) local decode = protobuf.decode("protos.rep_E_C2S_GET_SERVER_LIST", msg:GetBodyInLua()) print("recv msg("..msg.MsgType..") E_C2S_GET_SERVER_LIST") protobuf.print_message_s(decode) end NetProcessorRegister.RegisterProcessor(E_PROTOCOL.E_C2S_GET_SERVER_LIST, PrintMsg_E_C2S_GET_SERVER_LIST);
local function PrintMsg_E_C2S_GET_GAME_ANN(msg)
local decode = protobuf.decode("protos.rep_E_C2S_GET_GAME_ANN", msg:GetBodyInLua())
print("recv msg("..msg.MsgType..") E_C2S_GET_GAME_ANN")
protobuf.print_message_s(decode)
end
NetProcessorRegister.RegisterProcessor(E_PROTOCOL.E_C2S_GET_GAME_ANN, PrintMsg_E_C2S_GET_GAME_ANN);
理解時要注意:
1
loadstring(code) 執行後
NetProcessorRegister.RegisterProcessor(E_PROTOCOL.E_C2S_GET_SERVER_LIST, PrintMsg_E_C2S_GET_SERVER_LIST);
外面這個語句並不會執行
loadstring(code)() 如果是這樣執行了 這句程式碼會被走到
但是 裡面的函式
PrintMsg_E_C2S_GET_SERVER_LIST 並不會執行的哈,不要以為會執行函式。
2. 如果裡面的函式定義的是全域性函式, 名字和其他地方名字一樣 會覆蓋原來的函式吧。 相當遠 require 了一個lua檔案進來 這麼理解就應該能明白了。
1