1. 程式人生 > >lua裡實現類似巨集定義,動態生成程式碼

lua裡實現類似巨集定義,動態生成程式碼

其實就是用了  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