您好,欢迎访问一九零五行业门户网

Lua print table(类似PHP中的print

会php的人都知道php中的print_r/var_export函数,可以方便的用于打印数组或导出变量,lua中没有提供,实际应用中却是很多时候需要类的功能。 今天便封装了个简单函数,实现类功能,用来打印/导出table: -- dump.lua--[[dump对象@param mixed obj@return str
会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, isarray, 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    local isarray = function(arr)        local count = 0         for k, v in pairs(arr) do            count = count + 1         end         for i = 1, count do            if arr[i] == nil then                return false            end         end         return true, count    end    dumpobj = function(obj, level)        if type(obj) ~= table then            return wrapval(obj)        end        level = level + 1        local tokens = {}        tokens[#tokens + 1] = {        local ret, count = isarray(obj)        if ret then            for i = 1, count do                tokens[#tokens + 1] = getindent(level) .. wrapval(obj[i], level) .. ,            end        else            for k, v in pairs(obj) do                tokens[#tokens + 1] = getindent(level) .. wrapkey(k) .. = .. wrapval(v, level) .. ,            end        end        tokens[#tokens + 1] = getindent(level - 1) .. }        return table.concat(tokens, \n)    end    return dumpobj(obj, 0)end
测试代码:
-- test.lualocal 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,    array = {        1, 2, 3,        {            a = 21,            b = 22,            c = 23,        },    },    table = {        x = 100,        y = 200,        w = 960,        h = 640,    },    [88] = 88888,    [9.7] = 22222,}print(debug.dump(obj))
输出结果:
{        [string1] = hi! my name is lixianlin,        [9.7] = 22222,        [table] = {                [y] = 200,                [x] = 100,                [h] = 640,                [w] = 960,        },        [88] = 88888,        [string2] = aa\tbb\rcc\ndd\\ee\ff,        [int] = 9527,        [string3] = a\\tb\\rc\\n\\\\ee\ff,        [bool] = true,        [array] = {                1,                2,                3,                {                        [b] = 22,                        [a] = 21,                        [c] = 23,                },        },        [float] = 3.1415,}
函数特点:
1、理论上支持无限级table嵌套
2、格式化输出,可读性好
3、输出结果可直接用于lua代码
4、function、userdata、thread类型tostring输出
5、当字符串中含有控制字符时,可能有影响(代码中仅对\t,\r,\n等进行了处理)
其它类似信息

推荐信息