初学者,有错误希望指正。
16————————数据文件与持久化
--Entry{....}与Entry({....})等价。以一个表作为唯一参数
--使用name-value对来描述数据:
Entry{
author = "Donald E. Knuth",
title = "Literate Programming",
publisher = "CSLI",
year = 1992
}
Entry{
author = "Jon Bentley",
title = "More Programming Pearls",
publisher = "Addison-Wesley",
year = 1990
}
--使用name-value对描述的情况下,收集作者名的代码写为:
local authors = {} -- a set to collect authors
function Entry (b)
if b.author then authors[b.author] = true end
end
dofile("data")
for name in pairs(authors) do print(name) end
17——————————序列化
--序列化数据,将数据转换为字节流或者字符流。
--序列化函数
#!/usr/local/bin/lua
--序列化函数保存不带循环的table
function serialize(o)
if type(o)=="number" then
io.write(o)
elseif type(o)=="string" then
io.write(string.format("%q",o))
--lua string 标准库提供了格式化函数专门提供"%q"选项,使用双引号表示字符>串并且可以正确的处理包含引号和换行等特殊字符的字符串
elseif type(o) == "table" then
io.write("{\n")
for k,v in pairs(o) do
io.write(" [")
serialize(k)
io.write("] = ")
serialize(v)
--只要表是一个树形结构(没有共享的子表并且没有循环),可以处理嵌套表>)
io.write(",\n")
end
io.write("}\n")
else
error("cannot serialize a " .. type(o))
end
end
serialize{a=12, b='Lua', key='another "one"'}
--序列化函数保存带循环的table
--针对普通拓扑概念上的带有循环表和共享子表的table
--就是序列化一下表,把表理顺了写出来
function basicSerialize (o)
if type(o) == "number" then
return tostring(o)
else -- assume it is a string
return string.format("%q", o)
end
end
function save (name, value, saved)
saved = saved or {} -- initial value
io.write(name, " = ")
if type(value) == "number" or type(value) == "string" then
io.write(basicSerialize(value), "\n")
elseif type(value) == "table" then
if saved[value] then -- value already saved?
-- use its previous name
io.write(saved[value], "\n")
else
saved[value] = name -- save name for next time
io.write("{}\n") -- create a new table
for k,v in pairs(value) do -- save its fields
local fieldname = string.format("%s[%s]", name,
basicSerialize(k))
save(fieldname, v, saved)
end
end
else
error("cannot save a " .. type(value))
end
end
--[[
a = {x=1, y=2; {3,4,5}}
a[2] = a -- cycle
a.z = a[1] -- shared sub-table
save('a',a)
]]
a = {{"one", "two"}, 3}
b = {k = a[1]}
save('a', a)
save('b', b)
--[[
a = {}
a[1] = {}
a[1][1] = "one"
a[1][2] = "two"
a[2] = 3
b = {}
b["k"] = {}
b["k"][1] = "one"
b["k"][2] = "two"
]]