Linux | c&cpp | Email | github | QQ群:425043908 关注本站

itarticle.cc

您现在的位置是:网站首页 -> 后端开发 文章内容

Lua非常有用的工具——递归打印表数据-itarticl.cc-IT技术类文章记录&分享

发布时间: 8年前后端开发 163人已围观返回

Lua是一种非常小巧的语言。虽小,但五脏俱全。

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

该库对外只提供了3个函数:

table_print(table_name) --递归打印表中的所有数据

table_tostring(table_name) --将表转换成字符串

table_lib_test() --模块自测函数(测试用的)

将该源码保存在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)

发布时间: 8年前后端开发163人已围观返回回到顶端

很赞哦! (1)

文章评论

  • 请先说点什么
    热门评论
    162人参与,0条评论

站点信息

  • 建站时间:2016-04-01
  • 文章统计:728条
  • 文章评论:82条
  • QQ群二维码:扫描二维码,互相交流