Lua很是有用的工具——遞歸打印表數據

Lua是一種很是小巧的語言。雖小,但五臟俱全。
git

在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.luaui

該庫對外只提供了3個函數:lua

  • table_print(table_name)        遞歸打印表中的全部數據.net

  • table_tostring(table_name)   將錶轉換成字符串
    調試

  • table_lib_test()     模塊自測函數(測試用的)
    code

將該源碼保存在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)


固然,目前還不夠完善,只能說是將就用,還有不少地方須要改進的。但願你們多多提意見。

相關文章
相關標籤/搜索