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)
固然,目前還不夠完善,只能說是將就用,還有不少地方須要改進的。但願你們多多提意見。