Lua中实现table的打印输出(print table)

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

转载于:https://my.oschina.net/hqc17/blog/749668

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值