为了让游戏前端数据输出更加条理,做了一个简单树状结构来打印数据。
ccmlog.lua
local function __tostring(value, indent, vmap) local str = ‘‘ indent = indent or ‘‘ vmap = vmap or {} --递归结束条件 if (type(value) ~= ‘table‘) then if (type(value) == ‘string‘) then --字符串 str = string.format("[[%s]]", value) else --整数 str = tostring(value) end else if type(vmap) == ‘table‘ then if vmap[value] then return ‘(‘..tostring(value)..‘)‘ end vmap[value] = true end local auxTable = {} --保存元表KEY(非整数) local iauxTable = {} --保存元表value local iiauxTable = {} --保存数组(key为0) table.foreach(value, function(i, v) if type(i) == ‘number‘ then if i == 0 then table.insert(iiauxTable, i) else table.insert(iauxTable, i) end elseif type(i) ~= ‘table‘ then table.insert(auxTable, i) end end) table.sort(iauxTable) str = str..‘{\n‘ local separator = "" local entry = "\n" local barray = true local kk,vv table.foreachi (iauxTable, function (i, k) if i == k and barray then entry = __tostring(value[k], indent..‘ \t‘, vmap) str = str..separator..indent..‘ \t‘..entry separator = ", \n" else barray = false table.insert(iiauxTable, k) end end) table.sort(iiauxTable) table.foreachi (iiauxTable, function (i, fieldName) kk = tostring(fieldName) if type(fieldName) == "number" then kk = ‘[‘..kk.."]" end entry = kk .. " = " .. __tostring(value[fieldName],indent..‘ \t‘,vmap) str = str..separator..indent..‘ \t‘..entry separator = ", \n" end) table.sort(auxTable) table.foreachi (auxTable, function (i, fieldName) kk = tostring(fieldName) if type(fieldName) == "number" then kk = ‘[‘..kk.."]" end vv = value[fieldName] entry = kk .. " = " .. __tostring(value[fieldName],indent..‘ \t‘,vmap) str = str..separator..indent..‘ \t‘..entry separator = ", \n" end) str = str..‘\n‘..indent..‘}‘ end return str end ccmlog = function(m,fmt,...) local args = {...} for k,arg in ipairs(args) do if type(arg) == ‘table‘ or type(arg) == ‘boolean‘ or type(arg) == ‘function‘ or type(arg) == ‘userdata‘ then args[k] = __tostring(arg) end end args[#args+1] = "nil" args[#args+1] = "nil" args[#args+1] = "nil" local str = string.format("[%s]:"..fmt.." %s", m, unpack(args)) print(str) local off = 1 local p = CCLOGWARN if m == ‘error‘ then p = CCLOGERROR elseif m == ‘warn‘ then p = CCLOGWARN end while off <= #str do local subStr = string.sub(str, off, off+1024) off = off + #subStr --p(subStr) end end --打印測试 reserved = { [100] = { 300, 400}, 200, { 300, 500}, abc = "abc",[0] = {1,2,3,"abc"}} ccmlog("d","d",reserved)
打印效果例如以下:
为了让程序模块调用该打印接口,打印函数前加上module("ccmlog", package.seeall),并将此文件保存在相似lualibs的库文件夹,然后在程序中用require "ccmlog"来调用该函数了.
时间: 2024-11-05 18:32:31