Lua print table(类似PHP中的print_r/var_export)

会PHP的人都知道PHP中的print_r/var_export函数,可以方便的用于打印数组或导出变量,Lua中没有提供,实际应用中却是很多时候需要类似的功能。

今天便封装了个简单函数,实现类似功能,用来打印/导出table:

-- dump.lua

--[[
dump对象
@param mixed obj
@return string
]]
function debug.dump(obj)
    local getIndent, quoteStr, wrapKey, wrapVal, dumpObj
    getIndent = function(level)
        return string.rep("\t", level)
    end
    quoteStr = function(str)
        str = string.gsub(str, "[%c\\\"]", {
            ["\t"] = "\\t",
            ["\r"] = "\\r",
            ["\n"] = "\\n",
            ["\""] = "\\\"",
            ["\\"] = "\\\\",
        })
        return ‘"‘ .. str .. ‘"‘
    end
    wrapKey = function(val)
        if type(val) == "number" then
            return "[" .. val .. "]"
        elseif type(val) == "string" then
            return "[" .. quoteStr(val) .. "]"
        else
            return "[" .. tostring(val) .. "]"
        end
    end
    wrapVal = function(val, level)
        if type(val) == "table" then
            return dumpObj(val, level)
        elseif type(val) == "number" then
            return val
        elseif type(val) == "string" then
            return quoteStr(val)
        else
            return tostring(val)
        end
    end
    dumpObj = function(obj, level)
        if type(obj) ~= "table" then
            return wrapVal(obj)
        end
        level = level + 1
        local tokens = {}
        tokens[#tokens + 1] = "{"
        for k, v in pairs(obj) do
            tokens[#tokens + 1] = getIndent(level) .. wrapKey(k) .. " = " .. wrapVal(v, level) .. ","
        end
        tokens[#tokens + 1] = getIndent(level - 1) .. "}"
        return table.concat(tokens, "\n")
    end
    return dumpObj(obj, 0)
end

测试代码:

-- test.lua

local obj = {
    string1 = "Hi! My name is LiXianlin",
    string2 = "aa\tbb\rcc\ndd\\ee\"ff",
    string3 = "a\\tb\\rc\\n\\\\ee\"ff",
    int = 9527,
    float = 3.1415,
    bool = true,
    table = {
        1, 2, 3,
        {
            a = 21,
            b = 22,
            c = 23,
        },
    },
    [88] = 88888,
    [9.7] = 22222,
}
print(debug.dump(obj)

输出结果:

{
        ["string1"] = "Hi! My name is LiXianlin",
        [9.7] = 22222,
        ["table"] = {
                [1] = 1,
                [2] = 2,
                [3] = 3,
                [4] = {
                        ["b"] = 22,
                        ["a"] = 21,
                        ["c"] = 23,
                },
        },
        ["float"] = 3.1415,
        ["int"] = 9527,
        ["string3"] = "a\\tb\\rc\\n\\\\ee\"ff",
        ["bool"] = true,
        ["string2"] = "aa\tbb\rcc\ndd\\ee\"ff",
        [88] = 88888,
}

函数特点:

1、理论上支持无限级table嵌套

2、格式化输出,可读性好

3、输出结果可直接用于lua代码

4、function、userdata、thread类型tostring输出

5、当字符串中含有控制字符时,可能有影响(代码中仅对\t,\r,\n等进行了处理)

时间: 2024-10-05 13:53:45

Lua print table(类似PHP中的print_r/var_export)的相关文章

lua的table库中常用的函数

lua提供了一些辅助函数来操作table.例如,从list中insert和remove元素,对array的元素进行sort,或者concatenate数组中的所有strings.下面就详细地讲解这些方法. insert and remove table.insert将一个元素插入到指定位置,例如: t = {1, 2, 3} table.insert(t, 1, 4} t的结果将是{4, 1, 2, 3} insert的第二个参数是可以省略的,这样就会插入到数组的最后,从而不必移动其他元素.同样

lua的table库中的常用函数总结

https://www.cnblogs.com/daochong/p/7363649.html table是Lua语言中的一种重要的数据类型, table 的一些特性简单列举如下: (1).table 是一个“关联数组”,数组的索引可以是数字或者是字符串; (2).table 的默认初始索引一般以 1 开始; (3).table 的变量只是一个地址引用,对 table 的操作不会产生数据影响; (4).table 不会固定长度大小,有新数据插入时长度会自动增长; (5).table 所有索引值都

[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

Lua学习——table

table类型实现了“关联数组”.“关联数组”是一种具有特殊索引方式的数组.不仅可以通过证书来索引它,还可以使用字符串或其他类型(除了nil)来索引它.table是Lua中主要的数据结构机制(事实也是仅有的),具有强大的功能.基于table可以以一种简单.统一和高效的方式来表示普通数组.符号表.集合.记录.队列和其他数据结构. table的特性: table是一个“关联数组”,数组的索引可以是数字或者是字符串 table 的默认初始索引一般以 1 开始 table 的变量只是一个地址引用,对 t

Lua的Table表使用例子(便于使用查询)

一.table.insert() 1.1 1 local countries = {"China", "England", "Brazil"} 2 --尾插法(Pos不填,默认插入尾部) 3 table.insert(countries, "France") 4 --头插法(首部插入) 5 table.insert(countries, 1, "Australia") 6 7 dump(countries)

lua 的 table 处理

lua 的整体效率是很高的,其中,它的 table 实现的很巧妙为这个效率贡献很大. lua 的 table 充当了数组和映射表的双重功能,所以在实现时就考虑了这些,让 table 在做数组使用时尽量少效率惩罚. lua 是这样做的.它把一个 table 分成数组段和 hash 段两个部分.数字 key 一般放在数组段中,没有初始化过的 key 值全部设置为 nil .当数字 key 过于离散的时候,部分较大的数字 key 会被移到 hash段中去.这个分割线是以数组段的利用率不低于 50% 为

lua的table表处理 及注意事项

lua,一款很轻量级很nice很强大的脚本语言,做为lua中使用最为频繁的table表,在使用之时还是有颇多的好处与坑的: 下面是大牛 云风的一片关于lua table的blog,可使得对lua table内在机制 窥测一二: lua 的整体效率是很高的,其中,它的 table 实现的很巧妙为这个效率贡献很大. lua 的 table 充当了数组和映射表的双重功能,所以在实现时就考虑了这些,让 table 在做数组使用时尽量少效率惩罚. lua 是这样做的.它把一个 table 分成数组段和 h

Linux下C/C++和lua交互-Table

本来这些文章都是在我的个人网站www.zhangyi.studio,目前处在备案状态,暂时访问不了,所以搬到这边.  最近这两天需要弄清楚C++和lua间相互调用和数据传递,废话不多说,直接上过程. 首先是环境环境,Linux(Debian),安装lua,注意需要管理员权限. sudo apt-get install lua5.2 安装完后输入lua或者lua -v 严重是否安装成功以及安装的版本,当然,有了lua运行环境还不够我们还需要安装lua开发库既然我们安装的是lua5.2那么开发库同样

Lua整理——table库

table属性 table库是有一些辅助函数构成的,这些函数将table作为数组来操作.其中,有对列表中插入和删除元素的函数,有对数组元素进行排序的函数,还有对链接一个数组中所有字符串的函数. 0.table.getn()Lua 中我们经常假定 array 在最后一个非 nil 元素处结束. 这个传统的约定有一个弊端:我们的 array中不能拥有 nil 元素.对大部分应用来说这个限制不是什么问题,比如当所有的 array 有固定的类型的时候.但有些时候我们的 array 需要拥有 nil 元素