Lua非常有用的工具——递归打印表数据

递归打印lua表 递归打印lua表lua的print方法是不支持表的打印的,这样查看一个table的内容会变得非常麻烦,在写这篇博客之前我也从网上查找了大量资料,内容很多,但是都不能满足我的要求。要不输出格式不够美观要不就是用起来麻烦,比如要掉用一个自定义的方法才能打印,而且只能打印一个table。我的想法是让print方法支持表的打印,用法跟原生的没有差别,可以传递多个参数并且顺序打印。自己琢磨了一会儿发现输出内容 阅读详情

摘要: 展示了Lua库table_lib.lua源码,并说明如何使用。

Lua是一种非常小巧的语言。虽小,但五脏俱全。

在Lua中,我认为最最核心的数据结构就是表。表不仅可用作数组,还可以用作字典。Lua面向对象的实现也是用表实现的。

表对于Lua实在是太重要了!所以,在开发与调试过程中,让表可视化是非常迫切的需求。可Lua标准库里没有递归显示表中所有数据的函数。

于是,凭着对Lua的兴趣,我写了一个函数用于递归打印表中所有的数据。

废话不多话,如下为源代码:

-------------------------------------------------------------------
-- This library defines table_print(tb), table_tostring(tb) for 
-- printing table data
-- 
-- Author: Hevake Lee
-- Email : hevake_lcj@126.com
-------------------------------------------------------------------

local function _list_table(tb, table_list, level)
    local ret = ""
    local indent = string.rep(" ", level*4)

    for k, v in pairs(tb) do
        local quo = type(k) == "string" and "\"" or ""
        ret = ret .. indent .. "[" .. quo .. tostring(k) .. quo .. "] = "

        if type(v) == "table" then
            local t_name = table_list[v]
            if t_name then
                ret = ret .. tostring(v) .. " -- > [\"" .. t_name .. "\"]\n"
            else
                table_list[v] = tostring(k)
                ret = ret .. "{\n"
                ret = ret .. _list_table(v, table_list, level+1)
                ret = ret .. indent .. "}\n"
            end
        elseif type(v) == "string" then
            ret = ret .. "\"" .. tostring(v) .. "\"\n"
        else
            ret = ret .. tostring(v) .. "\n"
        end
    end

    local mt = getmetatable(tb)
    if mt then 
        ret = ret .. "\n"
        local t_name = table_list[mt]
        ret = ret .. indent .. "<metatable> = "

        if t_name then
            ret = ret .. tostring(mt) .. " -- > [\"" .. t_name .. "\"]\n"
        else
            ret = ret .. "{\n"
            ret = ret .. _list_table(mt, table_list, level+1)
            ret = ret .. indent .. "}\n"
        end
        
    end

   return ret
end

-------------------------------------------------------------------
-- Public functions
-------------------------------------------------------------------

function table_tostring(tb)
    if type(tb) ~= "table" then
        error("Sorry, it's not table, it is " .. type(tb) .. ".")
    end

    local ret = " = {\n"
    local table_list = {}
    table_list[tb] = "root table"
    ret = ret .. _list_table(tb, table_list, 1)
    ret = ret .. "}"
    return ret
end

function table_print(tb)
    print(tostring(tb) .. table_tostring(tb))
end

-------------------------------------------------------------------
-- For test
-------------------------------------------------------------------

local test_table_2 = {
    print,
}

local test_table_1 = {
    12, 22.5, true, 
    info = {
        name = "Jack", age = 26,
        lifeexp = {
            ["1986"] = "Both",
            ["2013"] = "Work in Tencent",
            ["2015"] = "Get married"
        }, 
        wife = "Lucy"
    },
    "Hello test",
    recu_table = test_table_2,
    ["2"] = 13
}

test_table_2.recu_table = test_table_1

local metatable = {
    __index = test_table_2,    
    __add = function(a, b) return 0 end
}

setmetatable(test_table_1, metatable)

function table_lib_test()
    table_print(test_table_1)
end

也可以访问git:http://git.oschina.net/hevake_lcj/LuaScripts/blob/master/table_lib.lua

该库对外只提供了3个函数:

  • table_print(table_name)        递归打印表中的所有数据

  • table_tostring(table_name)   将表转换成字符串

  • table_lib_test()     模块自测函数(测试用的)

将该源码保存在Lua的库路径下的叫 table_lib.lua 文件里。在命令终端运行 lua

我们可以自己试一试:

> require "table_lib"
> my_table = {name = 'Hevake Lee', age = 27, children = {'Peter', 'John'}}
> table_print(my_table)
table: 0x8fc77c8 = {
    ["children"] = {
        [1] = "Peter"
        [2] = "John"
    }
    ["name"] = "Hevake Lee"
    ["age"] = 27
}
>

就是这效果。

再试试打印 _G 表的内容,会有意想不到的惊喜。

> table_print(_G)

当然,目前还不够完善,只能说是将就用,还有很多地方需要改进的。希望大家多多提意见。

原文地址:https://my.oschina.net/hevakelcj/blog/408806

lua打印table 在调试lua代码的时候,经常需要看table里的内容,这时候一般都是将打印table的方法放到工具模块中,方便调用。 现在写一个简单的工具模块 util.lua local util = {} local function get_type_first_print( t ) local str = type(t) return string.upper(string.sub(st... 阅读详情

相关推荐

Lua元表(Metatable)详解

Lua 元表(Metatable)是 Lua 最强大的特性之一,允许自定义 table 的行为。本文详细介绍了元表的概念、核心元方法及其应用场景: 元表本质是包含特殊键(元方法)的普通表,通过 setmetatable/getmetatable 操作 核心元方法包括: __index(访问不存在键) __newindex(写入不存在键) 运算符重载方法(__add, __sub等) __call(使表可调用) __tostring(自定义输出) 实战应用示例: 实现继承和只读表 向量运算重载 函数式对象 自

weixin_58284606的博客 1398

lua实现scan函数

function dump(obj) local getIndent, quoteStr, wrapKey, wrapVal, dumpObj getIndent = function(level) return string.rep("\t", level) end quoteStr = function(s

403

Lua中的递归函数写法实例

主要介绍了Lua中的递归函数写法实例,本文直接给出代码实例,并作了简洁注释,需要的朋友可以参考下

显示文件名与行号、多等级、多输出打印、支持循环表的 Lua 打印器模块实现

模块简介 本文提供一款在 Lua 中实现的显示文件名与行号、多等级、多输出打印、支持循环表的打印器模块。此模块主要参照《饥荒:联机版》 Lua 源码改写完成,在此表示感谢。 环境 Lua 5.1.5 模块特性 支持多种输出级别,比如 Error Warning, Info 支持所有 Lua 类型,包括循环表 支持输出到多个目标,例如同时输出到终端及某个集合中(例如饥荒的游戏内控制台) 支持显...

Hustlion 的技术博客 1387

MCNP 减方差技巧(最全)

MCNP的减方差技巧,核心在于不显著增加计算时间的前提下,通过修改模拟过程来降低结果的统计误差。尤其适用于,这类问题中粒子很难到达探测器区域,直接模拟效率极低栅元重要性是常用的减方差技巧,该方法主要对计算模型的不同区域定义不同的重要性数值。当粒子从重要性低的区域废物重要性高的区域,产生更多粒子,增大统计量;当从重要性高的区域进入重要性低的区域,会进行,增快计算效率。n= 中子,N;光子,P;电子 Exi= 栅元i的重要性I=栅元总数项目IMP卡是必须的,除非使用了WWN卡如果粒子进入0。

chencheng1127的博客 926

01 底盘制动产品之轮速传感器

轮速传感器是用来测量汽车车轮转速的传感器。对于现代汽车而言,轮速信息是必不可少的,汽车动态控制系统(VDC)、汽车电子稳定程序(ESP)、防抱死制动系统(ABS)、自动变速器的控制系统等都需要轮速信息。

汽车软件工程师 | 好奇博主 | 处女座 4659

Lua数据文件

`LUA`脚本语言之数据文件与持久化是本文要介绍的内容,当我们处理数据文件的,一般来说,写文件比读取文件内容来的容易。因为我们可以很好的控制文件的写操作,而从文件读取数据常常碰到不可预知的情况。...

森明帮大于黑虎帮的博客 597

告别手动操作!用Python脚本批量处理Siemens NX零件文件(导入/导出/移除参数)

本文详细介绍了如何利用Python脚本实现Siemens NX零件文件的批量处理,包括导入、导出和移除参数等操作。通过NX Open API和Python UF接口,工业设计师可以大幅提升工作效率,告别繁琐的手动操作。文章提供了完整的实战指南,涵盖环境配置、核心功能实现以及性能优化技巧,特别适合需要进行Siemens-NXUG二次开发的工程师参考。

weixin_28222493的博客 260

Lua 打印table表内容

lua打印table结构

木可的博客 3446

别再乱装了!Win10下NVIDIA显卡驱动、CUDA 11.0和cuDNN 8.0.5保姆级配置指南(含版本匹配避坑)

本文提供Win10下NVIDIA显卡驱动、CUDA 11.0和cuDNN 8.0.5的保姆级配置指南,详细解析版本匹配逻辑与安装步骤。从驱动选择到环境变量配置,再到框架测试,手把手教你避开常见坑点,确保深度学习环境一次配置成功。特别强调版本匹配的重要性,帮助开发者高效搭建GPU开发环境。

weixin_30600197的博客 307

(超详细)Scala环境搭建(scala-2.12.15、IDEA2021.1.3)

Scala环境搭建(scala-2.12.15、IDEA2021.1.3) JunLeon——go big or go home 目录 Scala环境搭建(scala-2.12.15、IDEA2021.1.3) 一、Scala概述 1、什么是Scala? 2、Scala发展史 3、Scala与Java的关系 二、Scala环境搭建 1、环境准备 2、Scala安装与配置环境变量 3、验证Scala 三、编写第一个Scala程序 1、使用IDEA创建maven工程 2、.

JunLeon的博客 3万+

lua表的打印,luatable的打印

lua打印luaTable local strformat = string.format local tbinsert = table.insert function logTable(_table,tName) local sp = " " local list = {} local function NewLine(str) tbinsert(list, str); end local function AnalysisString(tt, ...

u014417405的专栏 723

从零开始:如何用Python建立你的第一个人工智能模型

在这篇文章中,我们将介绍如何从零开始使用Python建立你的第一个人工智能模型。无论你是刚接触编程的新手,还是有经验的开发者想进一步探索人工智能领域,这篇文章都将为你提供清晰、详细的指南。我们将一步步探索数据预处理、模型建立、训练和测试的过程,以及如何解读模型的结果。

Allen1862105的博客 4万+

Lua打印对象

Lua打印对象 --- -- @function: 获取table的字符串格式内容,递归 -- @tab: table -- @ind:不用传此参数,递归用(前缀格式(空格)) -- @return: format string of the table function dumpTab(tab,ind...

Linuxer_Martin 2188

微信小程序 - 获取当前日期时间(函数封装)

效果图 前言 摘自微信小程序demo程序中utils.js方法。 普通newDate()出来的日期时间,并不是我们想要的格式,所以要进行格式整理。 解决方案 打开utils.js文件(随意),复制以下代码: /** *获取当前时间 *@description自定义日期分钟秒数 *@param{Object}date-newData()对象 *@returnString */ functionformatTime(date){ //年月日

🏆 前端领域优质创作者 2843

Openclaw第5章 知识库管理

💡:学会使用 OpenClaw构建个人知识库系统,实现网页文章存档、GitHub项目管理、论文笔记整理和跨设备同步。

Maynor的博客 775

Lua格式化打印输出

Lua没有断点调试,只能通过打印输出进行调试,非常不便,打印也只能打印简单的数据,稍微复杂一点的表也没法打印,下面封装了一个可以打印复杂的table的接口,可以直接拷贝使用:function Util.tablePrint(t)      local print_t_cache={}    local function sub_tablePrint(t,indent)        if (pri...

木木三的专栏 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Lua打印table中所有数据

function LuaHelps.PrintTable(t, name) local spaceAdd = 4 local function getTableStr(t, name, space) local str = string.format("%s%s = {\n", string.rep(" ", space - spaceAdd), (name or "table")) local init = false for k, v i.

OneWord233的博客 2123

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

如何打印出lua里table的内容

有时,你可能需要根据特定的需求来自定义打印函数,例如,将输出重定向到文件或图形界面。-- 处理每个参数end-- 实现自定义的打印逻辑end在这个自定义函中,你可以根据需要处理每个参数,并实现自己的打印逻辑。在 Lua 中,除了最常用的print函数之外,没有内置的其他打印函数。但是,你可以使用其他方法来实现类似打印的功能,或者创建自定义的打印函数。io.write函数io.write函数用于向标准输出写入数据,但它不会像print那样在每次调用后自动添加换行符。\n")结合print或。

tecoes的博客 1315

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【步兵 lua】尾递归 打印table

【步兵 lua】尾递归 打印table by EOS.脚本语言打印数据结构是很常见的功能,因为脚本语言大多数情况都是用文本编辑区去写, 自然缺少了ide的调试之类的强大功能,但相对的开发环境就轻便了很多。比如 我,用的就是NodePad++,一个轻量级文本编辑器。先上图看看效果 如图所示,我用的是缩进形式打印的,个人感觉这样看着更舒服、清晰 。 (ps: 而且相对的要简单一些=。=)

博客 by EOS. 642

【脚本LUA】Lua中打印一个Table

function print_r ( t ) local print_r_cache={} local function sub_print_r(t,indent) if (print_r_cache[tostring(t)]) then print(indent.."*"..tostring(t)) else ...

平凡的世界 4315

lua表深拷贝和浅拷贝

lua表是 一种常用的 数据结构, 底层实现分为散列表和数组 表 可以理解为 引用类型,也就是说,如果把 一个表的对象赋值给另一个 变量,那么得到的其实是这个表的内存地址。 local t10={1,2,3,4,5,6} local t9=t10 t9[1]=10 print(t10[1]) 这里会打印10 那么深度拷贝需要如何实现? 1)递归 首先遍历一个表,判断它的值是否是 一个表,如果是一个表进行递归拷贝, 这里需要考虑一种情况, 就是带环的情况。 什么是环:一个简单的例子: local t={1,

zebin的博客 2990

lua按不同深度递归打印嵌套table

目标table: local a = { { "a11", "a12", "a13" }, { "b21", "b22", "b23" }, { "c31", "c32", "c33", ccc = {"cccc"}, cpt = {"uuuuu"...

qq_43850484的博客 669

Lua 完美打印数据

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33802505的博客 598
上一篇: 如何解决错误:A script behaviour has a different serialization layout when loading
下一篇: Lua 调试(Debug)
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值