chapter 12_2 保存无环的table

本文介绍了一种在Lua中序列化Table的方法,包括一个递归函数serialize,用于处理树状结构的Table。讨论了如何处理数字和非法标识符作为Key的问题,并提供了增强函数强健性的解决方案。

  保存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\"",
}

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

 

转载于:https://www.cnblogs.com/daiker/p/5842178.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值