《Programming in Lua 3》读书笔记(十六)

2023-05-16

日期:2014.7.23

PartⅢ The Standard Libraries
20 The Table Library
table库包含一些辅助函数用以类似与数组一样操作table。提供了从list内插入和删除元素的操作,对数组的元素进行排序的操作,将table中所有的string连接起来的操作。
20.1 Insert and Remove
Insert
table的insert操作有三个参数:要被插入数据的table;插入的位置;插入的值。如果插入的位置不是最后一个,那么lua会将该位置至最后一个位置的元素的位置后移一位,如:当前table的t = {10,20,30},此时执行table.insert(t,1,25),即在t的第一个位置插入数据25,得到的结果为 t = {25,10,20,30},位置1及之后的数据位置后移,然后将新的元素插入至1号位置。假如没有提供要插入的位置这个参数,那么默认插入的位置是table的最后的位置,此时不需要移动其他的元素。
Remove
table的remove操作将会移除table中给定位置的一个元素,在这位置之后的元素位置前移,如果没有提供需要移除的位置这个参数,则默认移除最后一个元素。
使用这两个运算函数便可以直观的实现栈、队列、双端队列。使用table初始化一个数据结构,t = {},在尾部添加元素:table.insert(t,x);删除尾部的元素:table.remove(t);由于table库是以c语言来实现这两个函数的,所以在效率上是有保障的。
20.2 Sort
table.sort函数。该函数的参数有两个,一个为需要排序的table,另一个是提供排序规则的函数。排序函数需要有两个参数,并且当第一个参数达到了排序规则的要求(假如递增排序的情况,第一个参数大于了第二个参数),那么此时就需要返回true。
遍历数组的时候推荐使用ipairs而不是pairs,因为前者以1、2、3的顺序遍历,而后者是以任意的顺序来遍历的。
当我们需要对table的目录进行排序的时候,需要将这些目录首先存储至一个数组,然后再对数组进行排序。因为table中的目录没有顺序可言。
e.g.
lines = {
     luaH_set = 10,
     luaH_get = 23,
     luaH_present = 48,
}
table.sort( lines )
for n in pairs(lines) do
     print(n)
end
此时打印出来的是:luaH_set、luaH_present、luaH_get,并没有按照顺序来排列
e.g.
a = {}
for n in pairs(lines) do
     a[#a + 1] = n
end
table.sort(a)
for _, n in ipairs(a) do
     print(n)
end
此时打印出来的是:luaH_get、luaH_present、luaH_set,此时便是按照字典顺序对table的目录进行了排序。
使用迭代器来实现排序:
function pairsByKeys( t,f )          --参数f可以提供自定义的排序方法
     local a = {}
     for n in pairs(t) do
          a[#a + 1] = n
     end
     table.sort(a,f)
     local i = 0
     return function (  )
          i = i + 1
          return a[i],t[a[i]]
     end
end

for name,line in pairsByKeys(lines) do
     print(name,line)
end
20.3 Concatenation
使用table.concat函数将一串string型变量作为参数,返回的结果是将这些string型变量连接起来。接受一个额外参数作为每个string型变量直接的连接符,默认是没有的。该函数也接受额外的两个参数:用来指定返回结果的第一个和最后一个string型变量。
下面这个函数
function rconcat( l , s)
     if type(l) ~= "table" then return l end
     local res = {}
     for i = 1,#l do    
          res[i] = rconcat(l[i])
     end
     return table.concat(res)
end

所实现的功能是将一个嵌套多个table的table进行连接,返回连接结果。

 

转载于:https://www.cnblogs.com/zhong-dev/p/4044569.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Programming in Lua 3》读书笔记(十六) 的相关文章

  • Lua中字符串的串联

    在许多语言中 您可以在变量赋值时连接字符串 我有一个使用 Lua 编程语言的场景 我需要将命令的输出附加到现有变量 Lua 中是否有与以下示例等效的功能 其他语言的例子 PERL filename checkbook filename tm
  • 如果模式匹配,则打印 lua 表中的值

    好吧 我最近刚接触 lua 发现自己陷入了以下困境 我有函数peripheral getNames 这是一个自定义函数 它将返回一个具有结构 key value 的表 而 key 始终是一个数字 从 1 开始 value 将是该函数找到的内
  • 如何在表格内打印表格的内容? [路亚]

    我想做的只是在表中打印表的内容 例如 local stats table1 tTable1 data 1 tTable2 data2 2 tTable3 data3 3 我并不真正关心表 1 或所有表 而是关心数据变量中的信息 我怎样才能打
  • 如何加载目录中的所有文件?

    正如标题所说 如何加载目录中的每个文件 我对c 和lua都感兴趣 编辑 对于 Windows 我很高兴能得到一些真正的工作代码 尤其是 lua 我可以用 boost filesystem for c 来做 对于 Lua 你需要模块Lua文件
  • 在 lua 中使用相等运算符比较数字有多安全?

    在我的引擎中 我有一个用于脚本编写的 Lua VM 在脚本中 我写了这样的内容 stage stage 1 if stage 5 then end and objnum tonumber 5 if stage objnum 根据 Lua 来
  • 十六进制常数 = 格式错误的数字?

    我有一个 Lua 脚本 我试图在其中使用十六进制数字 0x 如果我使用官方 Windows 二进制文件在控制台中运行此脚本 它可以正常工作 但是如果我在我的应用程序中运行它 简单的 dofile 我得到 malformed number n
  • Lua中如何获取目录列表

    我需要 LUA 中的目录列表 假设我的目录路径为 C Program Files 我需要该特定路径中所有文件夹的列表以及如何搜索该列表中的任何特定文件夹 Example 需要路径 C Program Files 中所有文件夹的列表 以下是上
  • Lua中如何对数字表求和?

    Lua有内置的吗sum 功能 我似乎找不到一个 我几乎翻遍了文档中的所有地方 或许table sum 或类似的东西 以遵循当前的约定 但由于我找不到它 我不得不实现它 function sum t local sum 0 for k v i
  • 在 Corona sdk 上保存高分?

    我想保存游戏中创建的高分 并且当玩家点击高分按钮时可以在主菜单中看到 有人可以帮助我吗 您可以使用SQLITE https docs coronalabs com api library sqlite3 index html将高分保存到数据
  • C 的哪些部分最可移植?

    我最近读到了 Lua 联合创始人 Luiz H de Figueredo 和 Roberto Ierusalimschy 的采访 他们讨论了 Lua 的设计和实现 至少可以说这是非常有趣的 然而 讨论的一部分让我想起了一些事情 Robert
  • 用于嵌入式服务器的 Web 技术

    我最近开始了一个针对嵌入式设备的新 Web 开发项目 并希望征求一些有关使用技术的建议 该设备将提供 HTML 页面 其中包括用于从 JSON 服务器检索数据的 AJAX 代码 我们暂时使用 Cherokee 作为 Web 服务器 但我们并
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • Lua-迭代嵌套表

    我已经学习 Lua 几个星期了 这一次又一次成为我的症结所在 我尝试阅读有关该主题的帖子和书籍 我使用 Lua 查询软件监控系统 Nimsoft 我的数据以表格形式返回给我 我不会发布整个输出 但这里有一个我认为可以描述结构的片段 表参考是
  • 如何在 Lua 中实现 OO?

    Lua 没有内置对 OO 的支持 但它允许您自己构建它 您能否分享一些实现面向对象的方法 请为每个答案写一个例子 如果您有更多示例 请发布另一个答案 我喜欢将 OOP 视为容器 对象 内的数据封装以及可以使用该数据完成的操作子集 还有很多内
  • 确定已编译Lua的编译器版本

    我有一些已编译的 LuaQ 我需要确定用于编译它的确切版本 有什么可能的方法吗 编译的脚本在文件开头有一个标头 4 bytes signature x1bLua 1 byte version 0x51 1 byte format 1 byt
  • Lua中如何获取表中的最大整数?

    Lua中如何获取表中的最大整数 在Lua 5 1及更早版本中 你可以使用 math max unpack 1 2 3 4 5 这受到Lua堆栈大小的限制 在 PUC Lua 5 1 上 该值的最大值可达 ca 8000 个数字 如果堆栈空闲
  • 去掉尾随零和小数点

    使用 Lua 我将数字格式化为可变位数并去掉尾随零 小数点 例如 string format precision f value gsub 0 1 gsub 值的类型为数字 正数 负数 整数 小数 所以任务已经解决了 但出于美学 教育和性能
  • 比较 Lua 中的日期

    我有一个带有日期表的变量 如下所示 table day number 15 year number 2015 month number 2 如何获取当前日期与上述日期之间的天数 非常感谢 您可以使用os time 将表转换为秒并获取当前时间
  • 如何在我的 Lua 脚本中添加“睡眠”或“等待”?

    我正在尝试通过更改一天中的时间来为游戏制作一个简单的脚本 但我想快速完成 这就是我要说的 function disco hour minute setTime 1 0 SLEEP setTime 2 0 SLEEP setTime 3 0
  • Openresty 中的并发模型是什么?

    我很难理解 openresty 或 nginx 的并发模型 我读了Lua变量作用域 http wiki nginx org HttpLuaModule Lua Variable Scope 它解释了变量的生命周期 但它没有说明对它们的并发访

随机推荐