第一版是針對 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\"",
    }
我們可以針對每個案例測試是否需要方括號來改善這個結果;同樣地,我們會將這個改進留作練習。