table的一些扩展方法

table.print = function(t, tname, print_one_level)
	if type(t) ~= "table" then
		print("deep_print error, parameter accept is not a table!")
		return
	end
	local _deep_count = 0
	local print_one_table
	local max_deep = deep or 10
	local printed_tables = {}
	local t_path = {}
	tname = tname or "root_table"
	print_one_table = function(tb, tb_name, print_one_level)
		tb_name = tb_name or "table"
		table.insert(t_path, tb_name)
		local tpath, i, tname = ""
		for i, pname in pairs(t_path) do
			tpath = tpath.."."..pname
		end
		printed_tables[tb] = tpath
		_deep_count = _deep_count + 1
		local k, v, str
		local tab = string.rep(" ", _deep_count*4)
		--print(string.format("%s  [ 0x%s ]t\n%s  {    ", tab, string.sub(tostring(tb), 8), tab))
		print(string.format("%s  {", tab))
		for k, v in pairs(tb) do
			if type(v) == "table" then
				if printed_tables[v] then
					str = string.format("%s    %s = [ %s ]t", tab, output_value(k), printed_tables[v])
					print(str)
				elseif not print_one_level then
					str = string.format("%s    %s = ", tab, output_value(k))
					print(str)
					print_one_table(v, tostring(k))
				else
					str = string.format("%s    %s = %s", tab, output_value(k), output_value(v))
					print(str)
				end
			else
				str = string.format("%s    %s = %s", tab, output_value(k), output_value(v))
				print(str)
			end
		end
		print(tab.."  }")
		table.remove(t_path)
		_deep_count = _deep_count - 1
	end
	print_one_table(t, tname, print_one_level)
	printed_tables = nil
end

-- return a copy of table<src>, just copy the data or the top level.
table.clone = function(src)
	local rel = {}
	if type(src) ~= "table" then
		return rel
	end
	local k, v
	for k, v in pairs(src) do
		rel[k] = v
	end
	return rel
end

-- return a deep copy of table<src>
table.deep_clone = function(src)
	if type(src) ~= "table" then
		return src
	end
	local copy_table
	local level = 0
	local function clone_table(t)
		level = level + 1
		if level > 20 then
			--for a,b in pairs(src) do print(a,b) end -- for debug
			error("table clone failed, source table is too deep!")
		end
		local k, v
		local rel = {}
		for k, v in pairs(t) do
			if type(v) == "table" then
				rel[k] = clone_table(v)
			else
				rel[k] = v
			end
		end
		level = level - 1
		return rel
	end
	return clone_table(src)
end

table.size = function(tb)
	if type(tb) ~= "table" then return 0 end

	local k, i = nil, 0
	for k in pairs(tb) do
		i = i + 1
	end
	return i
end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值