第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些区别。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目


12.1.1 – 保存不带循环的表

我们的下一个(也是更难的)任务是保存表。根据我们对表结构的假设限制,有几种方法可以做到这一点。没有一种算法适用于所有情况。简单的表不仅需要更简单的算法,而且生成的文件也可能更美观。

我们的第一次尝试如下

    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\"",
    }
我们可以通过测试每种情况是否需要方括号来改进此结果;同样,我们将把此改进作为练习。