当前位置: 首页 > news >正文

Lua非常有用的工具——递归打印表数据

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)



当然,目前还不够完善,只能说是将就用,还有很多地方需要改进的。希望大家多多提意见。

相关文章:

  • C风格字符串
  • UVa 10924-Prime Words
  • linux Shell编程
  • Vue--数据传输
  • CentOS 6.4 yum快速搭建Zabbix 2.2版本(中文)
  • python excel 转 csv
  • Android自定义控件实现简单的轮播图控件
  • 2016.04.22-2016.04.28这周工作时间和内容
  • Python 主要模块和常用方法简览
  • IBM在云计算中推动了Swift并使用了Swift的运行环境、包目录和其更多属性
  • ToughRADIUS 安装配置指导(视频教程)
  • ZeroMQ(java)之I/O线程的实现与组件间的通信
  • mysql 5.7.12----bin/mysqld --initialize --user=mysql出错
  • javascript获取当前的时间戳
  • java使用Executor(执行器)管理线程
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 0x05 Python数据分析,Anaconda八斩刀
  • ES6语法详解(一)
  • FastReport在线报表设计器工作原理
  • Github访问慢解决办法
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript HTML DOM
  • maya建模与骨骼动画快速实现人工鱼
  • supervisor 永不挂掉的进程 安装以及使用
  • 笨办法学C 练习34:动态数组
  • 聊聊directory traversal attack
  • 聊聊flink的TableFactory
  • 收藏好这篇,别再只说“数据劫持”了
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 我感觉这是史上最牛的防sql注入方法类
  • 我看到的前端
  • 学习JavaScript数据结构与算法 — 树
  • 学习使用ExpressJS 4.0中的新Router
  • 运行时添加log4j2的appender
  • Java总结 - String - 这篇请使劲喷我
  • PostgreSQL之连接数修改
  • 进程与线程(三)——进程/线程间通信
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #define用法
  • #Linux(Source Insight安装及工程建立)
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (1)SpringCloud 整合Python
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (正则)提取页面里的img标签
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .NET Core 项目指定SDK版本
  • .net 程序发生了一个不可捕获的异常
  • .NET 设计一套高性能的弱事件机制