博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lua中实现table的打印输出(print table)
阅读量:7078 次
发布时间:2019-06-28

本文共 1563 字,大约阅读时间需要 5 分钟。

  hot3.png

首先,定义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

你可能感兴趣的文章
eclipse创建maven
查看>>
layer ui使用多层弹框时,各个页面交互问题
查看>>
linux基本命令2 创建文件/文件夹/复制文件/文件夹
查看>>
BackSwap银行***利用三种全新技术清空银行帐户
查看>>
html+css+js(+JQuery)制作扑克牌图片切换效果
查看>>
电脑远程连接建立和设置连接选项操作步骤
查看>>
MySQL常用查询语句(23个)
查看>>
Date/TimePicker
查看>>
pc端车牌识别在智能机器人上的应用
查看>>
对接小结
查看>>
JMS简介与ActiveMQ实战
查看>>
余弦相似度计算
查看>>
中国的招商×××大误区
查看>>
C#解码base64编码的二进制数据的代码
查看>>
VFIO透传
查看>>
Spring Boot 整合 docker
查看>>
一个网络管理员应该掌握的mysql管理命令
查看>>
display:none
查看>>
linux 比较重要的常用命令
查看>>
关于outlook的使用
查看>>