保存不带循环的表

简介: 保存不带循环的表

保存表有几种方法,选用那种方法取决于对具体表结构的假设,但没有一种算法适用于所有的情况。对于简单的表来说,不仅可以使用更简单的算法,而且输出也会更简洁和清晰。


先看一个简单的想法:

function serialize(o)
  local t = type(o)
  if t == "number" or t == "string" or t == "boolean" or t == "nil" then
    io.write(string.format("%q", o))
  elseif t == "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


尽管这个函数很简单,但它却可以合理地满足需求。只要表结构是一棵树(即没有共享的字表和环),那么该函数甚至能够处理嵌套的表(即表中还有其他的表)。


上例中的函数假设了表中的所有键都是合法的标识符,如果一个表的键是数字或者不是合法的 Lua 标志符,那么就会有问题。解决该问题的一种简单方式是像下列代码一样处理每个键:

io.write(string.format("  [%s] = ", serialize(k)))


经过这样的修改,我们提高了该函数的健壮性,但却牺牲了结果文件的美观性。考虑如下调用:

serialize{a = 12, b = 'Lua', key = 'another "one"'}


第一版的函数 serialize 会输出:

{
  a = 12,
  b = "Lua",
  key = "another \"one\"",
}


与之对比,第二版的函数 serialize 则会输出:

{
  ["a"] = 12,
  ["b"] = "Lua",
  ["key"] = "another \"one\"",
}


提示

代码运行失败。。。


通过测试每个键是否需要方括号,可以在健壮性和美观性之间得到平衡。

目录
相关文章
|
8月前
|
Java
【Java】— —实现人物对象的增、删、改、查(注:对象的删除以逻辑删除为主,在person类中设置“删除状态字段”,字删除该字段时,将状态改为有效。)
【Java】— —实现人物对象的增、删、改、查(注:对象的删除以逻辑删除为主,在person类中设置“删除状态字段”,字删除该字段时,将状态改为有效。)
|
8月前
|
存储 弹性计算 运维
从文件中删除重复的行
【4月更文挑战第29天】
56 1
|
8月前
|
弹性计算 运维 Shell
实现文件存在与否的判断
【4月更文挑战第30天】
52 1
|
8月前
|
Java 大数据 数据处理
获取到数据循环写文件
这段代码是一个Java方法,用于分批处理数据。它定义了初始值和每批处理的数量,然后通过`PageInfo`对象获取数据。如果总数小于1,则直接返回空列表。否则,循环处理数据,防止环境中的多次空跳过,并在处理完一批数据后更新页码。代码中还提到,这个过程可以用于减少大数据操作带来的风险。此外,配有一张动图,可能表示数据处理的过程。
54 1
|
Python
python如何读取xlsx文件,并指定读取某一列,逐个逐个取出指定列中的值
要读取xlsx文件并指定读取某一列,可以使用Python中的pandas库。以下是一个读取xlsx文件并逐个逐个取出指定列中的值的示例代码:
1445 0
|
SQL 关系型数据库 MySQL
十一、操作delete或者update语句,加个limit或者循环分批次删除
十一、操作delete或者update语句,加个limit或者循环分批次删除
355 0
|
存储 算法
保存带有循环的表
保存带有循环的表
97 0
for循环写入100条数据到文件中 1.获取文件对象 2.for循环 100次 3.每次都要想文件中写入内容
for循环写入100条数据到文件中 1.获取文件对象 2.for循环 100次 3.每次都要想文件中写入内容