Lua保存不带循环的 table

保存不带循环的 table

我们下一个艰巨的任务是保存表。根据表的结构不同,采取的方法也有很多。没有一种单一的算法对所有情况都能很好地解决问题。简单的表不仅需要简单的算法而且结果文件也需要看起来也更美观。
我们第一次尝试如下:

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

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

将 io.write(" ", k, " = ") 改为:
io.write("[);serialize(k);io.write("]")即可。
发布了268 篇原创文章 · 获赞 153 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39885372/article/details/104367914
今日推荐