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

浙公网安备 33010602011771号