« 在 lua 中实现函数的重载 | 返回首页 | 今天遭遇太好笑的房东 »

树型打印一个 table

php 中有个 print_r 函数,可以递归打印一张表。很多 php 程序员喜欢用这个去调试程序。

我想,所有写过一定代码量的 lua 程序员都会写一个类似的东西放着备用吧。这两天调试 lua 程序的时候,发现以前做的简陋的 print_r 不够好用。对于复杂的 table 打印出来一大篇很不直观。结果就放下手头的工作,花了整整一个小时,写了下面几十行代码。把 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

print_r(a)

可以输出成:

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

代码参考这里:

树型打印一个 table

其实实现的细节需要注意的就两个地方:一个是考虑循环引用的问题。(一般用 table 模拟树结构都会记录一个 parent 节点的引用,这样就造成了循环引用)

一个是表格线的处理,对最后一个子节点需要特殊处理。

这段代码的输出风格不算美观,至少不如那些显示文件目录结构的命令行工具。不过我觉得是够用就成,另外需要尽量紧凑,不浪费空间。需要更美观的同学,其实也可以很容易的对其改进。

Comments

用递归实现的table的树形打印,基本上和原table形式一样。。
http://blog.csdn.net/laozitianxia/article/details/18733987

ps:最近在扒风云的blog看,刚进入游戏行业,还要多向大牛学习啊。。

如果key是table呢,会打印key的地址吧?

呵呵,变量一长,看这个树的是很很累,就少许修改了下:


function print_r(sth)
if type(sth) ~= "table" then
print(sth)
return
end

local space, deep = string.rep(' ', 4), 0
local function _dump(t)
local temp = {}
for k,v in pairs(t) do
local key = tostring(k)

if type(v) == "table" then
deep = deep + 2
print(string.format("%s[%s] => Table\n%s(",
string.rep(space, deep - 1),
key,
string.rep(space, deep)
)
) --print.
_dump(v)

print(string.format("%s)",string.rep(space, deep)))
deep = deep - 2
else
print(string.format("%s[%s] => %s",
string.rep(space, deep + 1),
key,
v
)
) --print.
end
end
end

print(string.format("Table\n("))
_dump(sth)
print(string.format(")"))
end

用 PHP 时间不短了,竟然没注意还有 print_r 这个函数,真是惭愧啊。

to mm:
本人精通php,依然没人要!!

我要。。。发简历给我

不知道有没有人需要暑期的兼职学生啊

本人精通php,依然没人要!!

php我都是用var_dump(),因为可以打印出变量的类型。

第一,嘿嘿

Post a comment

非这个主题相关的留言请到:留言本