为了让游戏前端数据输出更加条理,做了一个简单树状结构来打印数据。
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)
~~~
打印效果如下:
![](https://box.kancloud.cn/2016-02-22_56cb2ca36f718.jpg)
为了让程序模块调用该打印接口,打印函数前加上module("ccmlog", package.seeall),并将此文件保存在类似lualibs的库目录,然后在程序中用require "ccmlog"来调用该函数了.
- 前言
- lua学习笔记之一(C/C++程序员的Lua快速入门[初阶话题])
- lua学习笔记之二(C/C++程序员的Lua快速入门[进阶话题])
- lua学习笔记之三(C/C++程序员的Lua快速入门[高阶话题])
- lua学习笔记之四(Lua中的基本函数库)
- lua学习笔记之五(Lua中的数学库)
- Lua中的table函数库
- Lua中的常用操作系统库
- LUA string库
- LUA IO库
- VS2010编译Lua程序(lua-5.2.3)
- Lua中调用C函数(lua-5.2.3)
- Lua 常用数据结构
- lua 如何输出树状结构的table?
- Lua中的元表与元方法
- lua 函数回调技巧
- Cocos2d-x使用Luajit实现加密
- Lua中的模块与module函数
- 我所理解lua 语言中的点、冒号与self
- Lua代码编写规范