chapter 12_2 保存无环的table

  保存table有几种方法,选用哪种方法取决于对table的结构作出了哪些限制性的假设

第一个方法:

function serialize(o)
    if type(o) == "number" then
        io.write(o)
    elseif type(o) == "string" then
        io.write(string.format("%q",o))
    else if type(o) == "table then
        io.write("{\n")           --写table开头
        for k,v in pairs(o) do
            io.write(" ",k," = ")
            serialize(v)          --递归调用serialize
            io.write(",\n")
        end
        io.write("}\n")           --写table结尾
    else
        error("cannot serialize a " .. type(o))
    end
end

只要table的结构是一个树结构,这种方法还能处理嵌套的table。

如果一个table的key为数字或者非法的Lua标识符,就会出现问题,一个简单的解决办法是:

io.write(" ",k," = ")

改为:

io.write("  [");serialize(k); io.write("]= ")

这样,便增强了这个函数的强健性,但是损失了文件的美观性,对于调用:

serialize{a=12,b="Lua",key='another "one"'}

第一个版本的输出:

{
    a = 12,
    b = Lua,
    key = "another \"one\"",
}

而第二个版本:

{
   [a] = 12,
   [b] = Lua,
   [key] = "another \"one\"",
}

可以测试每种需要方括号的情况,从而改善结果的美观性。

 

posted @ 2016-09-05 14:31  daiker  阅读(162)  评论(0编辑  收藏  举报