LUA 表与相关库函数

Table表

LUA表是一种很强大的数据结构,他可以统一,简单且高效的表示数组、集合、对象等多种数据结构。

函数math.sin在LUA中就可以理解为以字符串sin作为键来检索math表。

表都是独立的,他和引用他的变量之间没有固定关系。

如:a = {}; b = a 表示a, b同时指向表 {},a中存放的是表的地址,而b赋值a,则b一样也是该表的地址。

表可以具有不同类型的索引,a["x"]等价a.x,但与a[x]无关,因为"x"作为字符串表示的是"x"键,而[x]表示的是变量,他对应x变量值表示的键。

 

表构造器与初始化

初始化的几种形式

a = {1, 2, 3, 4, 5} 等价 a = {[1]=1, [2]=2, [3]=3, [4]=4, [5]=5}

a = {"a", "b", "c"} 等价 a = {[1]="a", [2]="b", [3]="c"}

a = {x=10, y=20, z =30} 等价 a = {["x"]=10, ["y"']=20, ["z"] =30}

a = {}  等价 a={}

a.x = 10   a["x"] = 10

a.y = 20   a["y"] = 20

a.z = 30   a["z"] = 30

 

使用操作符#获取列表长度

对于连续的数组序列可以使用#来计算长度,print (#{1,2,nil,4}) --> 2,序列遇到空洞nil会使计算中断。

 

表的遍历

迭代器pairs用于遍历表中所有元素,而ipairs用于遍历连续的序列。

语法:for k, v in pairs(table) do something end

 

安全访问

判断深嵌套表:zip = (((a or {}).company or {}).director or {}).address

利用逻辑or逐一层的判断表或者子键是否为nil,从而最大程度减小对表的访问次数。

 

表插入:table.insert (list [,pos], value)

参数list:指定表,可选参数pos:指定插入位置,无参数时默认从尾端插入,参数value:插入的元素

如果插入的位置不是尾端,pos后面元素整体后移。

 

表删除:table.remove (list [,pos])

返回被删除的元素内容

参数list:指定表,可选参数pos:指定删除位置,无参数时默认从尾端删除。

如果删除的位置不是尾端,pos后面元素整体前移。

 

表连接:table.concat (list [,sep [,i [,j]]])

返回将序列中所有元素连接后的字符串

参数list:指定表,可选参数sep:拼接元素间的分割字符,无参数默认为""空字符,可选参数i:指定起始位置,可选参数j:指定终点位置。

 

表移动:table.move (list, i, j, pos [,list2])

参数list:指定表,参数i:选择起点,参数j:选择终点,参数pos:移动位置,可选参数list2:指定表2。

选择以i为起点j为终点区间内所有元素,将他们复制粘贴到pos位置或者是list2的pos位置,这个过程是一次覆盖的过程,并不会使其他元素移动。

 

表展开:table.unpack (list [,i [,j]])

返回参数列表,按指定范围(可选)将数组元素展开为可以被调用的参数列表

参数list:指定表,可选参数i:展开起点,可选参数j:展开终点

 

表排序:table.sort (list [,comp])

参数list:指定表,可选参数comp:排序函数,无参数时通常按升序排序。

排序函数针对表中连续的序列,其间不可以存在空洞nil,排序函数需要两个形参(对应表中每次参加比较的两个数据),而具体的排序方法需要函数返回比较两个形参的表达式,不能含有等于关系,例如>=,<=,==,~=。

do
    s = {{name="李四", lv=60},{name="李四", lv=55},{name="张三", lv=20},{name="王五", lv=24},{name="老刘", lv=80},{name="赵六", lv=34},{name="李四", lv=68}}
function st (s1, s2) -- 排序函数,两个形参(变量名随意) if s1.name == s2.name then -- 如果他们名字一样,就返回按等级升序排序 return s1.lv < s2.lv -- 如果第一个元素小于第二个元素则返回true,不做改变,反之返回false,变量值互换 else return s1.name < s2.name -- 否则按名字升序排序 end -- return s1.name < s2.name or s1.name == s2.name and s1.lv < s2.lv -- 与上面等价 end table.sort (s, st) for k, v in ipairs(s) do print (k, v.name, v.lv) end end

--[[

1  王五  24
2  张三  20
3  李四  55
4  李四  60
5  李四  68
6  赵六  34
7  老刘  80

--]]

 

posted @ 2022-01-09 11:51  黑姆豆  阅读(243)  评论(0)    收藏  举报