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


猜你喜欢

转载自blog.csdn.net/ooomyself/article/details/50715894