LUA教程保存不带循环的table-49

第一次尝试如下:

function serialize (o)
 
    if type(o) == "number" then
       io.write(o)
    elseif type(o) == "string" then
       io.write(string.format("%q", o))
    elseif type(o) == "table" then
       io.write("{\n")
       for k,v in pairs(o) do
           io.write(" ", k, " = ")
           serialize(v)
           io.write(",\n")
       end
 
       io.write("}\n")
    else
       error("cannot serialize a " .. type(o))
    end
end

尽管代码很简单,但很好地解决了问题。只要表结构是一个树型结构(也就是说,没有共享的子表并且没有循环),上面代码甚至可以处理嵌套表(表中表)。对于所进不整齐的表我们可以少作改进使结果更美观,这可以作为一个练习尝试一下。(提示:增加一个参数表示缩进的字符串,来进行序列化)。前面的函数假定表中出现的所有关键字都是合法的标示符。如果表中有不符合Lua语法的数字关键字或者字符串关键字,上面的代码将碰到麻烦。一个简单的解决这个难题的方法是将:

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

改为

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

这样一来,我们改善了我们的函数的健壮性,比较一下两次的结果:

 
-- result of serialize{a=12, b='Lua', key='another "one"'}
 
-- 第一个版本
{
a = 12,
b = "Lua",
key = "another \"one\"",
} 
 
-- 第二个版本
{
["a"] = 12,
["b"] = "Lua",
["key"] = "another \"one\"",
}

还可以通过测试每一种情况,看是否需要方括号。


发布日期:

所属分类: 编程 标签:


没有相关文章!