第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些区别。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目。
![]() |
用 Lua 编程 | ![]() |
| 第二部分。表和对象 第 12 章。数据文件和持久性 |
我们的下一个(也是更难的)任务是保存表。根据我们对表结构的假设限制,有几种方法可以做到这一点。没有一种算法适用于所有情况。简单的表不仅需要更简单的算法,而且生成的文件也可能更美观。
我们的第一次尝试如下
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
尽管简单,但该函数完成了一项合理的工作。它甚至处理嵌套表(即表中的表),只要表结构是一棵树(即没有共享的子表和循环)。一个小的美学改进是偶尔缩进嵌套表;您可以尝试作为练习。(提示:向 serialize 添加一个带有缩进字符串的额外参数。)
前面的函数假设表中的所有键都是有效的标识符。如果表具有数字键或不是语法有效的 Lua 标识符的字符串键,我们就会遇到麻烦。解决此困难的一种简单方法是更改行
io.write(" ", k, " = ")
为
io.write(" [")
serialize(k)
io.write("] = ")
通过此更改,我们提高了函数的健壮性,但牺牲了生成文件的审美性。比较
-- result of serialize{a=12, b='Lua', key='another "one"'}
-- first version
{
a = 12,
b = "Lua",
key = "another \"one\"",
}
-- second version
{
["a"] = 12,
["b"] = "Lua",
["key"] = "another \"one\"",
}
我们可以通过测试每种情况是否需要方括号来改进此结果;同样,我们将把此改进作为练习。
| 版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 | ![]() |