为了让游戏前端数据输出更加条理,做了一个简单树状结构来打印数据。
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)
打印效果如下:
Kotlin 接口与 Java 8 类似,使用 interface 关键字定义接口,允许方法有默认实现:interface MyInterface {fun bar() // 未实现...
委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象...
Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 error类型是一个接口类型,这是它的定义:type error interface {Err...