首先,定义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()。有问题可留言探讨。