第一版是为 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。保留所有权利。 |