写个 lua 打印 table 表函数

今天本来是在看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)

打印出来的内容有点多,就不贴出来了。

你可能感兴趣的:(lua)