Lua打印table升级版

原Lua打印table有个很致命的问题,递归深度过大会导致栈溢出(stack overflow)。

首先,需要明白,lua里出现栈溢出有以下情况:

“too many arguments”,

“assume array is smaller than 2^40 “,

“string slice too long”,

“too many captures”,

“too many arguments to script”,

“too many nested functions”

那么问题来了,如何才能不出现栈溢出呢?

我想,方法应该不止一种,我使用的是尾递归,Lua里使用尾递归是不会出现栈溢出的,不管递归深度有多大。下面是修改后的代码:

<span style="font-family:Courier New;">function getIndentSpace(indent)
     local str = ""
     for i =1, indent do
          str = str .. " "
     end
     return str
end

function newLine(indent)
     local str = "\n"
     str = str .. getIndentSpace(indent)
     return str
end

function createKeyVal(key, value, bline, deep, indent)

     return str
end

function getkeyvalstr(iters, iterIdx, bline, deep, indent, bstr, estr)
    local key ,value = iters[iterIdx]()
    while key == nil do
        if iterIdx == 1 then
            return bstr .. estr
        else
            iterIdx = iterIdx - 1

            key ,value = iters[iterIdx]()
			local right = ",";
			if true then
				if bline[deep] then
					indent = indent-4
					right = right .. newLine(indent) .. "}"
				else
					right = right .. "}"
				end
			end
			bstr = bstr .. right
			deep = deep - 1
        end
    end

	local left = ""
    local kv = "";
    if (bline[deep]) then
        kv = kv .. newLine(indent)
    end
    if type(key) == "string" then
        kv = kv.. key .. " = "
    end
    if type(value) == "table" then

        deep = deep + 1
		if bline[deep] then
			 kv = kv ..newLine(indent) .. "{"
			 indent = indent + 4
		else
			 kv = kv .. "{"
		end

        local iter = nextKeyValue(value)
        iterIdx = iterIdx+1
        iters[iterIdx] = iter

    elseif type(value) == "string" then
        kv = kv .. '"' .. tostring(value) .. '"'

    else
        kv = kv ..tostring(value)
    end
    left = left .. kv

    bstr = bstr .. left
    return getkeyvalstr(iters,iterIdx,  bline, deep, indent, bstr, estr);
end

function nextKeyValue(t)
    local iter, tb, key, value = pairs(t)
    return function()
        key, value = iter(tb, key);
        return key, value
    end
end

function getTableStr(t, bline, deep, indent)
     local iter = nextKeyValue(t)
     local iters = {}
     local idx = 1
     iters[idx] = iter

	local left
	 local right = ","
	 if bline[deep] then

		left = newLine(indent) .. "{"
		indent = indent + 4;
	else
		left = "{"
	end

	left = left .. getkeyvalstr(iters, idx, bline, deep, indent, "", "")
	if bline[deep] then
		indent = indent-4
		right = right .. newLine(indent) .. "}"
	else
		right = right .. "}"
	end
	return left .. right
end

function printtable(t)
    if type(t) ~= "table" then
        return
    end
     local str = getTableStr(t, {true, true, true}, 1, 0)
     print(str)
end</span>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 19:02:01

Lua打印table升级版的相关文章

lua 打印 table 拷贝table

-- 打印table function print_lua_table (lua_table, indent) if lua_table == nil or type(lua_table) ~= "table" then return end local function print_func(str) XLPrint("[Dongyuxxx] " .. tostring(str)) end indent = indent or 0 for k, v in pair

Lua打印table树形结构

1 module(..., package.seeall) 2 3 local g_Debug_Flag = true 4 5 function log(msg) 6 if g_Debug_Flag == false then 7 return 8 end 9 cclog(msg) 10 end 11 12 --- 13 --@function dump() 14 --@param value table 需要打印的 15 --@param description string 描述 16 --

Lua 打印Table

function dump(value, desciption, nesting) if type(nesting) ~= "number" then nesting = 3 end local lookupTable = {} local result = {} local function _v(v) if type(v) == "string" then v = "\"" .. v .. "\"" e

Lua中table类型的源码实现

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

lua的table表处理 及注意事项

lua,一款很轻量级很nice很强大的脚本语言,做为lua中使用最为频繁的table表,在使用之时还是有颇多的好处与坑的: 下面是大牛 云风的一片关于lua table的blog,可使得对lua table内在机制 窥测一二: lua 的整体效率是很高的,其中,它的 table 实现的很巧妙为这个效率贡献很大. lua 的 table 充当了数组和映射表的双重功能,所以在实现时就考虑了这些,让 table 在做数组使用时尽量少效率惩罚. lua 是这样做的.它把一个 table 分成数组段和 h

如何打印出lua里table的内容

不像开发as3时用fb有强大的断点调试功能,一般lua开发不用什么高级的ide,貌似也没有适合的,就直接用sublime.exvim等文本编辑器,直接编译运行看结果.所以不能很方便的知道变量值,特别是开发手游时,前后端调协议,如果无法查看后端发过来的数据就更蛋疼了.对于其他的数据还可以直接用print()函数打印出来,但对于table数据print()就无能为力了,所以可以写个自己写个方法,专门用于递归遍历并打印出table的内容.当需要看某个table的内容时,直接调用PrintTable(t

lua中table的遍历,以及删除

Lua 内table遍历 在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: 1. ipairs for index, value in ipairs(table) do end 注:这种方式的遍历只会从key为1的地方开始,一直以key递增1的顺序来遍历,若找到一个递增不是1的key就结束遍历,无论后面是否仍然是顺序的key. 1 --Sample_1: 2 local tab1 = 3 { 4 [1] = 1, 5 [2] = 2, 6 [

uLua/toLua加载protobuf转lua的table为bool的解决方法

当我们加载protobuf对应的lua的table的时候,我们使用如下方式来加载 local person_pb = require 'Protol.person_pb' 注意,这个table前面的Protol.这段一定不能去掉,如果去掉了,你加载到的persob_pb将会是一个bool类型的值. 如果加上这个Protol.的话,你才能加载到真正有的数据表. 也许是lua和protobuf工具关联时的一个约定,也许是这样,反正要放在protol文件夹下就能加载到数据表.

Linux下C/C++和lua交互-Table

本来这些文章都是在我的个人网站www.zhangyi.studio,目前处在备案状态,暂时访问不了,所以搬到这边.  最近这两天需要弄清楚C++和lua间相互调用和数据传递,废话不多说,直接上过程. 首先是环境环境,Linux(Debian),安装lua,注意需要管理员权限. sudo apt-get install lua5.2 安装完后输入lua或者lua -v 严重是否安装成功以及安装的版本,当然,有了lua运行环境还不够我们还需要安装lua开发库既然我们安装的是lua5.2那么开发库同样