保存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("{ ") --写table开头 for k,v in pairs(o) do io.write(" ",k," = ") serialize(v) --递归调用serialize io.write(", ") end io.write("} ") --写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"", }
可以测试每种需要方括号的情况,从而改善结果的美观性。