programming in lua 初读 16,17

初学者,有错误希望指正。

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"
]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值