Lua 自定义打印table函数
来源:互联网 发布:java redis2.9 教程 编辑:程序博客网 时间:2024/06/09 19:58
前言
一直用lua 作为游戏脚本语言来编程,而table在lua的数据结构中占据了大半壁江山,所以几乎每天的编程都离不开对table的使用,lua的table确实好用,插入、删除、查询都非常的方便,但是用多了也就渐渐的发现了一些问题,比如不知道table中都有哪些值,调试的时候面对巨大的table不知从何下手等等,所以我就有了一个想法,想看看lua中能不能直接打印table的值,网上看了一些文章发现都不太适合,决定自己动手写一个,要打印table这样的结构当然得用递归思想了,话不多说,直接上代码和大家分享一下。
代码示例
function dumptree(obj, width) -- 递归打印函数 local dump_obj; local end_flag = {}; local function make_indent(layer, is_end) local subIndent = string.rep(" ", width) local indent = ""; end_flag[layer] = is_end; local subIndent = string.rep(" ", width) for index = 1, layer - 1 do if end_flag[index] then indent = indent.." "..subIndent else indent = indent.."|"..subIndent end end if is_end then return indent.."└"..string.rep("─", width).." " else return indent.."├"..string.rep("─", width).." " end end local function make_quote(str) str = string.gsub(str, "[%c\\\"]", { ["\t"] = "\\t", ["\r"] = "\\r", ["\n"] = "\\n", ["\""] = "\\\"", ["\\"] = "\\\\", }) return "\""..str.."\"" end local function dump_key(key) if type(key) == "number" then return key .. "] " elseif type(key) == "string" then return tostring(key).. ": " end end local function dump_val(val, layer) if type(val) == "table" then return dump_obj(val, layer) elseif type(val) == "string" then return make_quote(val) else return tostring(val) end end local function count_elements(obj) local count = 0 for k, v in pairs(obj) do count = count + 1 end return count end dump_obj = function(obj, layer) if type(obj) ~= "table" then return count_elements(obj) end layer = layer + 1 local tokens = {} local max_count = count_elements(obj) local cur_count = 1 for k, v in pairs(obj) do local key_name = dump_key(k) if type(v) == "table" then key_name = key_name.."\n" end table.insert(tokens, make_indent(layer, cur_count == max_count) .. key_name .. dump_val(v, layer)) cur_count = cur_count + 1 end -- 处理空table if max_count == 0 then table.insert(tokens, make_indent(layer, true) .. "{ }") end return table.concat(tokens, "\n") end if type(obj) ~= "table" then return "the params you input is "..type(obj).. ", not a table, the value is --> "..tostring(obj) end width = width or 2 return "root-->"..tostring(obj).."\n"..dump_obj(obj, 0)end
运行示例
local t = { a = 1, b = 2, [1] = 34, ["1"] =56, pos = { x = 100, y = 200, z = 400, target = { pos = { x = 666, y = 456, }, src = "name", dest = nil, from = "china \n beijing" } }, [88] = 88888, [9.7] = 22222, func = function() print("this is a function") end, ["key"] = "value", [98] = { name = "albert", age = "18", }, ["98"] = {},}-- 调用函数运行print(dumptree(t))
运行结果
总结
- 这个函数是以树形的结构打印table,看起来比原型打印更加清晰。
- 结果中将一个空的table表示为
{}
的形式。 - 参数
width
主要是控制树杈的宽度,默认为2,会出现图中所表现的结果。 - 如果在使用过程中有什么问题,欢迎大家及时指出来,我会及时改正。
0 0
- Lua 自定义打印table函数
- Lua封装打印Table函数
- Lua利用自定义函数打印_G内容
- lua table 格式化打印
- 打印lua中的table
- lua 打印 table
- Lua打印table
- lua table打印
- 简单的写了一个打印Lua Table的函数
- lua调试打印table算法
- Lua打印Table内容(日期)
- Lua打印Table内容(日期)
- Lua打印table升级版
- lua树型打印table
- [福利]Lua 打印table代码
- lua table常用函数
- lua table 重要函数
- lua table函数
- leetcode 26. Remove Duplicates from Sorted Array
- 动画插值器
- 关于DataGridView的使用
- new/delete 与 malloc/free的区别是什么?
- Leetcode 357. Count Numbers with Unique Digits (Medium) (cpp)
- Lua 自定义打印table函数
- Android开发——常见的内存泄漏以及解决方案(一)
- oc和h5交互
- Ubuntu下几种常用的文本编辑器
- C++ 变量和基本类型(二) const 限定符
- Android源码分析-全面理解Context
- iOS开发 UIToolBar的使用
- python中reduce()、map()、filter()的学习
- 关于使用ActionMode做长按事件报空问题