首先,定义PrintTable函数,考虑到表中有表的嵌套情况,传入两个参数table和level,table是表名,level是表的层数,也就是表的嵌套层数,默认空即可。
然后我们需要对level变量初始化,确保默认情况下不是nil,接下来的工作就是确保输出美观,我们需要indent变量,控制缩进。通过for循环实现表的不同层能够保持有序的缩进。由于当表包含嵌套时,会影响表的输出美观,因此全局的key变量是保存有嵌套发生时,该嵌套表的表名。由于是脚本语言,我们希望尽可能少用全局变量,因此在不考虑美观的情况下,可以去掉它。
接下来的泛型for利用pairs迭代器对表遍历,使用固定格式的库函数string.format()实现内容的格式化,然后print出来。在此之前需要判断每个value是否是非表类型的,如果是表类型的,需要保存它的key名字,方便输出美观(如前所述,在不考虑美观的情况下,可以去掉这个玩意儿),然后进入函数本身做递归。
整个过程很简单,也很好理解,就是格式化的print,做成函数方便使用。下面贴出代码。
key = ""
function PrintTable(table , level)
level = level or 1
local indent = ""
for i = 1, level do
indent = indent.." "
end
if key ~= "" then
print(indent..key.." ".."=".." ".."{")
else
print(indent .. "{")
end
key = ""
for k,v in pairs(table) do
if type(v) == "table" then
key = k
PrintTable(v, level + 1)
else
local content = string.format("%s%s = %s", indent .. " ",tostring(k), tostring(v))
print(content)
end
end
print(indent .. "}")
end
在同一个文件内做一个测试例,以及输出:
local tbl = {[1] = 5,
[3] = 'test',
['a'] = 77543,
[2] = { ['t'] = 9, ['mon'] = 1, [4] = {['thou'] = 1000, ['w'] = 10000, [143] = 'gil'}, ['what'] = 'why'},
['apr'] = 4}
PrintTable(tbl)
--[[输出:
{
a = 77543
2 = {
what = why
t = 9
4 = {
143 = gil
thou = 1000
w = 10000
}
mon = 1
}
3 = test
1 = 5
apr = 4
}
--]]
该函数只是输出表内容,不对输出做排序,输出可能与原表定义的顺序不同,这是正常的,lua使用表的时候只需要引用其中内容,不关心内容与内容之间的顺序。要对表排序,参考table.sort()。有问题可留言探讨。