递归打印lua中的table

递归打印lua中的table,并写到文件里:

  1 local pairs_by_keys = function(inTable)
  2     local temp = {}
  3     for k, v in pairs(inTable) do
  4         temp[#temp + 1] = k
  5     end
  6
  7     local compare = function(a, b)
  8         if type(a) == type(b) then
  9             return a < b
 10         elseif type(a) == "number" then
 11             return true
 12         else
 13             return false
 14         end
 15     end
 16
 17     table.sort(temp, compare)
 18
 19     local i = 0
 20     return function()
 21         i = i + 1
 22         return temp[i], inTable[temp[i]]
 23     end
 24 end
 25
 26 local get_space_string = function(n)
 27     n = n or 0
 28     return string.rep("    ", n)
 29 end
 30
 31 -----------------------------------------------------
 32 local write_table_head = function(tableName, writer)
 33     if writer then
 34         tableName = tableName or "gdTable"
 35         writer("if not(type(" .. tableName .. ") == \"table\") then\n")
 36         writer("    " .. tableName .. " = {}\n")
 37         writer("end\n\n")
 38     end
 39 end
 40
 41 local function write_table_body(tableName, inTable, writer, deep)
 42     if inTable and writer then
 43         tableName = tableName or "gdTable"
 44         deep = deep or 0
 45
 46         local space = get_space_string(deep)
 47
 48         -- head
 49         writer(space .. tableName .. " = {\n")
 50
 51         -- body
 52         local spaceEx = get_space_string(deep + 1)
 53         for k, v in pairs_by_keys(inTable) do
 54             if type(k) == "number" then
 55                 k = "[" .. k .. "]"
 56             end
 57
 58             if type(v) == "table" then
 59                 write_table_body(k, v, writer, deep + 1)
 60             elseif type(v) == "string" then
 61                 writer(spaceEx .. k .. " = \"" .. v .. "\",\n")
 62             else
 63                 writer(spaceEx .. k .. " = " .. tostring(v) .. ",\n")
 64             end
 65         end
 66
 67         -- tail
 68         if deep > 0 then
 69             writer(space .. "},\n")
 70         else
 71             writer(space .. "}\n")
 72         end
 73     end
 74 end
 75
 76 ----------------------------------------------------------
 77 -- interface
 78 --
 79 write_table = function(inTable, tableName, filePath)
 80     local file = io.open(filePath, "w")
 81     if file then
 82         local writer = function(s)
 83             file:write(s)
 84         end
 85         write_table_head(tableName, writer)
 86         write_table_body(tableName, inTable, writer)
 87         file:close()
 88     end
 89 end
 90
 91 ----------------------------------------------------------
 92 -- test
 93 --
 94 local test = {
 95     [3] = 3,
 96     [1] = 1,
 97     b = "b",
 98     [2] = 2,
 99     a = "a",
100     sub = {
101         b = true,
102         [1] = "x",
103     },
104 }
105
106 write_table(test, "test", "out.lua")
时间: 2024-12-24 16:23:58

递归打印lua中的table的相关文章

lua中遍历table的几种方式比较

在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtest) do XXX end for key, value in ipairs(tbtest) do XXX end for i=1, #(tbtest) do XXX end for i=1, table.maxn(tbtest) do XXX end 前两种是泛型遍历,后两种是数值型遍历.当然你还会说

Lua中的table函数库

table.concat(table, sep,  start, end) concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开.除了table外, 其他的参数都不是必须的, 分隔符的默认值是空字符, start的默认值是1, end的默认值是数组部分的总长. sep, start, end这三个参数是顺序读入的, 所以虽然它们都不是必须参数,

Lua中的Table操作

Lua中table类似与C#种的字典,其实就是一个key-value键值对数据结构.来学习下table基本操作 Table的创建 myTable = {} --表名后面使用{}赋值,表示一个空的表 myTable = {name="海洋",age=18,isMan=true} --创建时候就添加键-值 myTable = {10,20,30,"Ocean"} --创建数字下标值的table,默认是从1开始 Table的赋值 myTable[3] = 34 --当键是

lua中的table、stack和registery

ok,前面准备给一个dll写wrapper,写了篇日志,看似写的比较明白了,但是其实有很多米有弄明白的.比如PIL中使用的element,key,tname,field这些,还是比较容易混淆的.今天正好搞搞清楚. 1.stack 这个应该不用多讲了,C和lua中的交互就是基于一个stack的,而且每次lua调用一个c函数,都是给分配一个新的stack.它的原型: typedef int (*lua_CFunction) (lua_State *L); stack中的基本单元在PIL中多成为ele

打印lua中全局变量的一段代码

function printTableItem(k, v, level) for i = 1, level do io.write(" ") end io.write(tostring(k), " = ", tostring(v), "\n") if type(v) == "table" then if not tablePrinted[v] then tablePrinted[v] = true for k, v in pa

lua中使用table实现类和继承

--因为只有当读写不存在的域时,才会触发__index和__newindex classA = {className = "classA",name="classAInst"} function classA:new(newobject) newobject = newobject or {} setmetatable(newobject, {__index = self})--当在newobject找不到key对应的value时,就到self(即classA)类中

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

Lua是一种非常小巧的语言.虽小,但五脏俱全. 在Lua中,我认为最最核心的数据结构就是表.表不仅可用作数组,还可以用作字典.Lua面向对象的实现也是用表实现的. 表对于Lua实在是太重要了!所以,在开发与调试过程中,让表可视化是非常迫切的需求.可Lua标准库里没有递归显示表中所有数据的函数. 于是,凭着对Lua的兴趣,我写了一个函数用于递归打印表中所有的数据. 废话不多话,如下为源代码: -----------------------------------------------------

Lua中table类型的源码实现

  1.概述 table是lua中唯一的表示数据结构的工具.它可以用于实现数据容器.函数环境(Env).元表(metatable).模块(module)和注册表(registery)等其他各种用途.因此了解table的实现是非常有必要的,根据<Lua中数据类型的源码实现>中知道,在Lua中,table是由结构体体Table来实现的.下面将以Lua 5.2.1的源码来看table的实现.   2.实现原理 在Lua5.0以后,table是以一种混合型数据结构来实现的,它包含一个哈希表部分和一个数

Torch-RNN运行过程中的坑 [1](读取Lua非空table,size为0)

0.踩坑背景 执行Torch-RNN的时候,在LanguageModel.lua中的encode_string函数中,对start_text的各个character进行id映射编码,实现功能类似"北京天安门"-->"5 10 88 32 111",方便后面的计算. 这个函数会利用一个全局的类似HashMap的table,hashmap中的key是character(char),value是id(int),涉及到一个从hashmap中按照key取值的操作,代码如