今天本来是在看lua 的debug库,看到
--[[ debug.getregistry()
函数返回Lua的注册表信息"registry"。]]
然后比较好奇这个注册表的内容是什么,就自己写了个打印lua table表的函数。
一开始没考虑table表循环的问题,写了个测试,在没有循环的情况下还行,但debug.getregistry()返回的表是有循环的。
然后在网上找来写资料,看有没哟能用的,发现都不满足自己的想法,所以还是自己写个把。用lua5写的,不一定符合所有人的需求,仅当做个记录。最终的方案如下:
-- 将值转换成字符串
function Val2Str(value)
local value_cach = {} -- 防止闭环
local tinsert = table.insert
local tconcat = table.concat
local sformat = string.format
local sgsub = string.gsub
function _Val2Str(value, prefix)
local str = ""
local tbList = {}
local oldprefix = prefix or ""
prefix = oldprefix.." "
local value_type = type(value)
if value_type == "table" then
local value_name = tostring(value)
if value_cach[value] then
-- 循环打印,直接用table的地址,并给个提示
return sformat("\"%s\" , -- loop table", value_name)
end
value_cach[value] = 1
tinsert(tbList, sformat("%s--%s", '{', value_name))
for k, v in pairs(value) do
local temp = _Val2Str(v, prefix)
local key
if type(k) == "number" then
key = sformat("[%s]", k)
else
key = sformat("[\"%s\"]", tostring(k))
end
local line = sformat("%s%s = %s,", prefix, key, temp)
tinsert(tbList, line)
end
tinsert(tbList, oldprefix..'}')
elseif value_type == "number" then
tinsert(tbList, tostring(value))
elseif value_type == "string" then
local temp = tostring(value)
temp = sgsub(temp, "\\", "\\\\")
temp = sgsub(temp, "\n", "\n"..prefix.." ")
local temp = sformat("[==[%s]==]", temp)
tinsert(tbList, temp)
else
-- 非数字和字符串的,直接调用tosgring获取显示值
local temp = sformat("\"%s\"", tostring(value))
tinsert(tbList, temp)
end
str = tconcat(tbList, "\n")
return str
end
local str = _Val2Str(value)
print(str)
return str
end
-- 进行转换
local t_registry = debug.getregistry()
local s_registry = Val2Str(t_registry)
打印出来的内容有点多,就不贴出来了。