[Lua] Lua print table

转载自:http://blog.csdn.net/lixianlin/article/details/24739499

会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.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,  
    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))  

输出结果:

-- 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,  
    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))  

函数特点:

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lua中的table是一种非常重要的数据结构,可以用来存储和组织数据。在Lua中,table可以被看作是一种关联数组,它可以通过任意类型的值作为索引来访问和操作其中的元素。 在Lua中,我们可以使用不同的方式来循环遍历table的元素。下面是几种常见的循环方式: 1. 使用pairs函数循环遍历table的键值对: ```lua local myTable = {key1 = value1, key2 = value2, key3 = value3} for key, value in pairs(myTable) do print(key, value) end ``` 这种方式会遍历table中所有的键值对,并将键和值分别赋值给变量key和value。 2. 使用ipairs函数循环遍历table的数组部分: ```lua local myTable = {"apple", "banana", "orange"} for index, value in ipairs(myTable) do print(index, value) end ``` 这种方式适用于table中只包含连续整数作为索引的情况,它会遍历数组部分,并将索引和对应的值分别赋值给变量index和value。 3. 使用数字索引循环遍历table: ```lua local myTable = {10, 20, 30} for i = 1, #myTable do print(i, myTable[i]) end ``` 这种方式适用于table中只包含连续整数作为索引的情况,通过指定起始索引和结束索引的方式来循环遍历table。 4. 使用迭代器函数循环遍历table: ```lua local myTable = {key1 = value1, key2 = value2, key3 = value3} for key, value in pairs(myTable) do print(key, value) end ``` 这种方式使用了Lua中的迭代器函数,可以自定义遍历table的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值