一、前言函數
最近在作關於openresty方面的工做,涉及到lua腳本語言,常常須要打日誌查看內容。普通的print函數遇到nil或table時,很是無力。而項目中的代碼常常遇到參數爲nil或table的情形。因此,若是想解決上面的問題,將整個table類型數據的結構輸出到控制檯,那就使用循環+遞歸的方式來輸出數據吧。測試
二、函數實現lua
--[[ print_dump是一個用於調試輸出數據的函數,可以打印出nil,boolean,number,string,table類型的數據,以及table類型值的元表 參數data表示要輸出的數據 參數showMetatable表示是否要輸出元表 參數lastCount用於格式控制,用戶請勿使用該變量 ]] function print_dump(data, showMetatable, lastCount) if type(data) ~= "table" then --Value if type(data) == "string" then io.write("\"", data, "\"") else io.write(tostring(data)) end else --Format local count = lastCount or 0 count = count + 1 io.write("{\n") --Metatable if showMetatable then for i = 1,count do io.write("\t") end local mt = getmetatable(data) io.write("\"__metatable\" = ") print_dump(mt, showMetatable, count) -- 若是不想看到元表的元表,可將showMetatable處填nil io.write(",\n") --若是不想在元表後加逗號,能夠刪除這裏的逗號 end --Key for key,value in pairs(data) do for i = 1,count do io.write("\t") end if type(key) == "string" then io.write("\"", key, "\" = ") elseif type(key) == "number" then io.write("[", key, "] = ") else io.write(tostring(key)) end print_dump(value, showMetatable, count) -- 若是不想看到子table的元表,可將showMetatable處填nil io.write(",\n") --若是不想在table的每個item後加逗號,能夠刪除這裏的逗號 end --Format for i = 1,lastCount or 0 do io.write("\t") end io.write("}") end --Format if not lastCount then io.write("\n") end end
三、測試例子spa
--[[ print_dump是一個用於調試輸出數據的函數,可以打印出nil,boolean,number,string,table類型的數據,以及table類型值的元表 參數data表示要輸出的數據 參數showMetatable表示是否要輸出元表 參數lastCount用於格式控制,用戶請勿使用該變量 ]] function print_dump(data, showMetatable, lastCount) if type(data) ~= "table" then --Value if type(data) == "string" then io.write("\"", data, "\"") else io.write(tostring(data)) end else --Format local count = lastCount or 0 count = count + 1 io.write("{\n") --Metatable if showMetatable then for i = 1,count do io.write("\t") end local mt = getmetatable(data) io.write("\"__metatable\" = ") print_dump(mt, showMetatable, count) -- 若是不想看到元表的元表,可將showMetatable處填nil io.write(",\n") --若是不想在元表後加逗號,能夠刪除這裏的逗號 end --Key for key,value in pairs(data) do for i = 1,count do io.write("\t") end if type(key) == "string" then io.write("\"", key, "\" = ") elseif type(key) == "number" then io.write("[", key, "] = ") else io.write(tostring(key)) end print_dump(value, showMetatable, count) -- 若是不想看到子table的元表,可將showMetatable處填nil io.write(",\n") --若是不想在table的每個item後加逗號,能夠刪除這裏的逗號 end --Format for i = 1,lastCount or 0 do io.write("\t") end io.write("}") end --Format if not lastCount then io.write("\n") end end print("---------------Test---------------") local myData = nil print_dump(myData) print("-------------------") myData = true print_dump(myData) print("-------------------") myData = 10086 print_dump(myData) print("-------------------") myData = "your name" print_dump(myData) print("-------------------") myData = { null = nil, bool = true, num = 20, str = "abc", subTab = {"111", "222"}, func = print_dump, sunTab = {"sun_a", {"sun_1", "sun_2"}, {you = "god", i = "man"}} } local mt = {} mt.__add = function(op1, op2) return 1000 end mt.__index = {1,2} setmetatable(myData, mt) print_dump(myData, 1) -- 第二個參數不爲空則打印元表 print("---------------End---------------")
四、測試結果調試