为方便调试lua程序,往往想以树的形式打印出一个table,以观其表内数据。以下罗列了三种种关于树形打印lua table的方法;法一
local print = print
local tconcat = table.concat
local tinsert = table.insert
local srep = string.rep
local type = type
local pairs = pairs
local tostring = tostring
local next = nextfunction print_lua_table (lua_table, indent)if not lua_table or type(lua_table) ~= "table" thenreturn;endindent = indent or 0for k, v in pairs(lua_table) doif type(k) == "string" thenk = string.format("%q", k)endlocal szSuffix = ""if type(v) == "table" thenszSuffix = "{"endlocal szPrefix = string.rep("    ", indent)formatting = szPrefix.."["..k.."]".." = "..szSuffixif type(v) == "table" thenprint(formatting)print_lua_table(v, indent + 1)print(szPrefix.."},")elselocal szValue = ""if type(v) == "string" thenszValue = string.format("%q", v)elseszValue = tostring(v)endprint(formatting..szValue..",")endend
end

  以上是一个树形打印lua table 【原方法的链接】的基本源码,虽是参考云风的方法而来,却 不能够支持表内循环(打印出来的样子还是挺符合 一般人的心里预期的);

法二

譬如一下这个例子: 因为表内引用了自身造成循环引用,所以打印方法也就成了 死循环了;

a = {}
a.a = {hello = {alpha = 1 ,beta = 2,},world =  {foo = "ooxx",bar = "haha",root = a,
    },
}
a.b = {test = a.a
}
a.c = a.a.hello

下面是 云风大神 关于lua table树形打印的源码链接;

local print = print
local tconcat = table.concat
local tinsert = table.insert
local srep = string.rep
local type = type
local pairs = pairs
local tostring = tostring
local next = nextfunction print_r(root)local cache = {  [root] = "." }local function _dump(t,space,name)local temp = {}for k,v in pairs(t) dolocal key = tostring(k)if cache[v] thentinsert(temp,"+" .. key .. " {" .. cache[v].."}")elseif type(v) == "table" thenlocal new_key = name .. "." .. keycache[v] = new_keytinsert(temp,"+" .. key .. _dump(v,space .. (next(t,k) and "|" or " " ).. srep(" ",#key),new_key))elsetinsert(temp,"+" .. key .. " [" .. tostring(v).."]")endendreturn tconcat(temp,"\n"..space)endprint(_dump(root, "",""))
end

那么打印出来的效果是这样:

+a+hello+alpha [1]
| |     +beta [2]
| +world+root {.}
|       +bar [haha]
|       +foo [ooxx]
+c {.a.hello}
+b+test {.a}

上面的方法,如果摒除去 root = a 这项元素的循环引用,可打印出来的样子是这样的:

["a"] = {["hello"] = {["alpha"] = 1,["beta"] = 2,},["world"] = {["bar"] = "haha",["foo"] = "ooxx",},
},
["c"] = {["alpha"] = 1,["beta"] = 2,
},
["b"] = {["test"] = {["hello"] = {["alpha"] = 1,["beta"] = 2,},["world"] = {["bar"] = "haha",["foo"] = "ooxx",},},
},["a"] = {["hello"] = {["alpha"] = 1,["beta"] = 2,},["world"] = {["bar"] = "haha",["foo"] = "ooxx",},
},
["c"] = {["alpha"] = 1,["beta"] = 2,
},
["b"] = {["test"] = {["hello"] = {["alpha"] = 1,["beta"] = 2,},["world"] = {["bar"] = "haha",["foo"] = "ooxx",},},
},

法三:

也可以利用lua的序列化将lua表转化为string,再将其给print出来;

-- 序列化tablle表--將表轉化成string
function serialize(obj)local lua = ""local t = type(obj)if t == "number" thenlua = lua .. objelseif t == "boolean" thenlua = lua .. tostring(obj)elseif t == "string" thenlua = lua .. string.format("%q", obj)elseif t == "table" thenlua = lua .. "{\n"for k, v in pairs(obj) dolua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n"endlocal metatable = getmetatable(obj)if metatable ~= nil and type(metatable.__index) == "table" thenfor k, v in pairs(metatable.__index) dolua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n"endendlua = lua .. "}"elseif t == "nil" thenreturn nilelsereturn "-nil-" --error("can not serialize a " .. t .. " type.")endreturn lua
end

下面附上 lua的反序列化方法(即 将string[内容是lua table]再转会lua table)

-- 反序列化tablle表--將string轉化成table
function unserialize(lua)local t = type(lua)if t == "nil" or lua == "" thenreturn nilelseif t == "number" or t == "string" or t == "boolean" thenlua = tostring(lua)elseerror("can not unserialize a " .. t .. " type.")endlua = "return " .. lualocal func = loadstring(lua)if func == nil thenreturn nilendreturn func()
end

转载于:https://www.cnblogs.com/jadeboy/p/3972524.html

树形打印lua table表相关推荐

  1. Lua——table(表)的使用

    文章目录 一.基本知识 二.table的构造 1.使用步骤 2.示例演示 三.table的操作 1.操作语法 2.示例演示 一.基本知识 (1)table 是 Lua 的一种数据结构用来帮助我们创建不 ...

  2. Lua table(表)

    table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua ta ...

  3. Lua之table(表)

    Lua table(表) 使用表来统一表示Lua中的一切数据,是Lua区分于其他语言的一个特色.这个特色从最开始的Lua版本保持至今,很大的原因是为了在设计上保持简洁.Lua表分为数组和散列表部分,其 ...

  4. Lua 中 table(表) 的简单使用

    Lua table(表) table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能 ...

  5. Lua - 输出打印table表

    lua自带的print函数只能打印可转化为字符串的数据,如果打印table表的话,则会和打印函数和userdata类型数据一样,输出为内存地址的形式.工作中因项目需要,可打印table表的话,对bug ...

  6. LUA table.sort的问题,数组与表的区别

    LUA table.sort的问题,数组与表的区别 t = {[1] = 222,[2] = 23,[3] = 2433,[4] = 135, } t1 = {222,23,2433,135, } t ...

  7. Lua语言之table表

    table有两种形式,数组形式与键值对形式. 一:table基本用法 1.table基本使用 ①初始化 table 表名 = {} ②赋值 数组形式: newTable[0] = "BeiJ ...

  8. html表格判断,lua table 长度解析

    先来看 lua table 源码长度获取部分(ltable.c) j 是数组部分的长度.首先判断数组长度大于 0,并且数组最后一个是 nil,就用二分法查找,返回长度. 如果 t->node 是 ...

  9. 【LUA table 移除操作非常慢】

    [LUA table 移除操作非常慢] LUA的表有插入和删除两种操作.插入操作非常快,100000次操作都在0.01S左右,而删除操作在表元素大于10000时却急速变慢,测试如下: t = {}lo ...

最新文章

  1. protobuf 2.5.0 编译jar
  2. php 手机唯一标示_Php获取移动设备唯一标识
  3. GraphQL报错:error: NetworkError when attempting to fetch resource.
  4. LeetCode 379. 电话目录管理系统(哈希set)
  5. FPGA状态机一段式
  6. BZOJ 1015 题解
  7. 如何使用JMeter自身代理录制APP测试脚本
  8. 武汉月薪1万5,感到焦虑怎么办?
  9. vijos 1071 01背包
  10. 衡量高分辨率图片生成效果的指标PSNR/SSIM
  11. 深度 DeepinXP-Lite V5.9
  12. 自己动手编译最新Android源码及SDK
  13. 放弃去FBI的机会,在美做了2年数据研究工作,如今回国创业,他把全球最顶级的智能预测算法带到了国内
  14. 基于区块链的二维码门禁系统成品演示视频
  15. sqlserver连接池及查看连接数相关
  16. 使用jQuery发送简单的Ajax请求
  17. pubmedy安装不聊了_在PubMed基本检索框中输入immunology检索出的文献为1115106 篇,这是利用了PubMed哪一种检索技术?...
  18. 【R语言】dplyr包
  19. 7.4 平面及其方程
  20. Bootstrap重抽样方法

热门文章

  1. Codeforces Round #438 B. Race Against Time
  2. Spring的4种事务管理(1种编程式事务+三种声明事务)
  3. exit()与_exit()函数的区别(Linux系统中)
  4. 编译安装nginx-1.6.0
  5. jquery 弹出层插件
  6. 我的CSDN博客之旅
  7. 问题三十八:C++中bad alloc问题(1)——分析问题
  8. 中琛源主要的产品是什么
  9. Selenium处理Select控件
  10. 找回计算机管理账户,怎样找回原来的电脑用户账号?