Lua语言输出table方法(dump工具)

作者: qufl | 来源:发表于2017-01-14 01:57 被阅读639次

版权声明:
本文为博主原创文章,转载请注明出处:Lua语言输出table方法(dump工具)
文章链接:http://www.jianshu.com/p/ea1aaede9772
严厉谴责某些个人及论坛转载博客且不标明文章为转载内容的行为。
请支持原创,维护作者权益!


在多人合作项目中偶尔会遇到这样的情况:
现在在调试程序,从其他小伙伴提供的方法中取到的table类型数据报错了,此时我们想检查一下数据格式。但是直接print又无法打印出来这个table的结构,真机测试时又不太方便在Lua中打断点,用for循环来输出又不能展开所有子table(有个dump工具该多好)。

所以,如果想解决上面的问题,将整个table类型数据的结构输出到控制台,那就使用循环+递归的方式来输出数据吧。

下面直接贴上代码以及测试用例:

感谢老司机Reyn在评论中提出的建议

--[[
print_dump是一个用于调试输出数据的函数,能够打印出nil,boolean,number,string,table类型的数据,以及table类型值的元表
参数data表示要输出的数据
参数showMetatable表示是否要输出元表
参数lastCount用于格式控制,用户请勿使用该变量
]]
function print_dump(data, showMetatable, lastCount)
    if type(data) ~= "table" then
        --Value
        if type(data) == "string" then
            io.write("\"", data, "\"")
        else
            io.write(tostring(data))
        end
    else
        --Format
        local count = lastCount or 0
        count = count + 1
        io.write("{\n")
        --Metatable
        if showMetatable then
            for i = 1,count do io.write("\t") end
            local mt = getmetatable(data)
            io.write("\"__metatable\" = ")
            print_dump(mt, showMetatable, count)    -- 如果不想看到元表的元表,可将showMetatable处填nil
            io.write(",\n")     --如果不想在元表后加逗号,可以删除这里的逗号
        end
        --Key
        for key,value in pairs(data) do
            for i = 1,count do io.write("\t") end
            if type(key) == "string" then
                io.write("\"", key, "\" = ")
            elseif type(key) == "number" then
                io.write("[", key, "] = ")
            else
                io.write(tostring(key))
            end
            print_dump(value, showMetatable, count) -- 如果不想看到子table的元表,可将showMetatable处填nil
            io.write(",\n")     --如果不想在table的每一个item后加逗号,可以删除这里的逗号
        end
        --Format
        for i = 1,lastCount or 0 do io.write("\t") end
        io.write("}")
    end
    --Format
    if not lastCount then
        io.write("\n")
    end
end

下面分别输出了nil,boolean,number,string,table类型的数据,测试代码如下:

print("---------------Test---------------")
local myData = nil
print_dump(myData)
print("-------------------")
myData = true
print_dump(myData)
print("-------------------")
myData = 10086
print_dump(myData)
print("-------------------")
myData = "your name"
print_dump(myData)
print("-------------------")
myData = {
    null = nil,
    bool = true,
    num = 20,
    str = "abc",
    subTab = {"111", "222"},
    func = print_dump,
    sunTab = {"sun_a", {"sun_1", "sun_2"}, {you = "god", i = "man"}}
}
local mt = {}
mt.__add = function(op1, op2) return 1000 end
mt.__index = {1,2}
setmetatable(myData, mt)
print_dump(myData, 1) -- 第二个参数不为空则打印元表
print("---------------End---------------")

dump输出的结果是这样的(因为内容太长,屏幕高度不够,所以分成了两张图):

上半部分输出.jpeg
下半部分输出.jpeg

如果不是有特殊需求,建议按照注释的提示,屏蔽子级table类型值的元表。屏蔽子级table类型值的元表之后输出看起来清爽很多。

屏蔽子级table的元表后的输出.jpeg

总结:
其实解决问题不难,需求是成长的直接动力。

其实为了dump输出图上的效果,我还是花了一些时间去做微调。最初末尾是没有换行的,也就是End那一行会紧接着上一行输出,虽然table的结构可以正常看到,但是如果dump的不是一个table,那就看着很奇怪了。时间总是花在细节上。

相关文章

  • Lua语言输出table方法(dump工具)

    版权声明:本文为博主原创文章,转载请注明出处:Lua语言输出table方法(dump工具)文章链接:http://...

  • Lua语法 dump()函数

    cocos2d-x 3.4版本lua新增了方法dump(),dump()为输出堆栈方法,可以方便的打印表table...

  • Lua -<2>- 类型和值

    注:lua5.0以上版本去除了table.getn方法,可以用#tableName代替 Lua是动态类型语言,变量...

  • lua 输出table

    function print_r ( t )local print_r_cache={}local functio...

  • aardio获取main()主函数启动时的传入参数

    aardio类似lua语言,也使用表table的数据结构

  • 基础: Lua数据对象模型

    Lua数据对象模型 首先Lua语言分为8种基本类型:nil、number、bool、string、table、th...

  • lua和c的初始

    lua和c的交互包括:c访问lua的变量、c访问lua的table、c调用lua的方法、lua调用c的函数 参考链...

  • lua进阶

    lua官网在线运行代码 table面向对象语法糖 lua对table中的函数调用做了优化,使用起来像类方法,增加了...

  • Table

    Table 最大值table.maxn 在 Lua5.2 之后该方法已经不存在了,我们定义了 table_maxn...

  • Lua -<4>- 基本语法

    注:lua5.0以上版本去除了table.getn方法,可以用#tableName代替 Lua 语句:赋值语句、控...

网友评论

  • e2ad7ba84f58:dump函数是LUA自带的吧?
    qufl:@e2ad7ba84f58 木有自带吧
  • 码上说:给你点个赞
  • 码上说:对打印普通表足够用了,可以考虑下有元表的情况。另外,可以把分析出来的表结构字符串存到一个表中,最后进行表元素连接来输出,这样可以减少io 操作,对于大表来说,这很效率。
    qufl:@_Reyn_ 好,谢谢~ 晚上更新
    码上说:@qufangliu 都是撸出来的经验呀,不要忘了再来更新呀
    qufl:多谢提醒,有元表的情况我确实是没考虑到。io操作的部分想到了,所以我避免了使用print和..操作,把输出缓存到一个表中的想法不错,学习一个~

本文标题:Lua语言输出table方法(dump工具)

本文链接:https://www.haomeiwen.com/subject/vccebttx.html