zoukankan      html  css  js  c++  java
  • lua 怎样输出树状结构的table?

    为了让游戏前端数据输出更加条理,做了一个简单树状结构来打印数据。

    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..'{
    '
            local separator = ""
            local entry = "
    "
            local barray = true
            local kk,vv
            table.foreachi (iauxTable, function (i, k)
                if i == k and barray then
                    entry = __tostring(value[k], indent..'  	', vmap)
                    str = str..separator..indent..'  	'..entry
                    separator = ", 
    "
                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..'  	',vmap)
                
                str = str..separator..indent..'  	'..entry
                separator = ", 
    "
            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..'  	',vmap)
    
                str = str..separator..indent..'  	'..entry
                separator = ", 
    "
            end)
    		
            str = str..'
    '..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"来调用该函数了.

  • 相关阅读:
    vue学习笔记 样式 class style(五)
    vue学习笔记 计算属性(四)
    vue学习笔记 模板语法(三)
    vue学习笔记 实例(二)
    vue学习笔记 概述(一)
    Babel指南——基本环境搭建
    手动es6编译es5(命令行)
    TrimPath
    git 远程仓库管理
    CSS左侧固定宽 右侧自适应(兼容所有浏览器)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4058573.html
Copyright © 2011-2022 走看看