第一版是針對 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
透過購買本書,您也可以支持 Lua 專案。
![]() |
程式設計 in 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。保留所有權利。 | ![]() |