lua 表操作
表的初始化
创建表
# 列表式:{value, value2, value3, ...}
t = {1,2,3,4}
# 记录式:(key=value, key2=value2, key3=value3, ...)
# key为lua标识符(只能由字母、数字、下划线组成)时,可不用中括号
# 不符合lua标识符规范的,需要用中括号括起来
t2 = {x='gtlx', y=2, z="hzw"}
# 混合使用列表示式、记录式:{value, value2, key=value3,...}
t3 = {1,2,3,key='瓜田李下'}
示例:表初始化
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
-- 列表法表示
> t={1,2,3,4,5,6}
> #t
6
-- key、value表示
> t={t=1}
> t={t=1,t2=2}
-- 不能用纯数字标识key,且不能以数字开头
> t={1=1}
stdin:1: '}' expected near '='
> t={11=1}
stdin:1: '}' expected near '='
> t={1a=1}
stdin:1: malformed number near '1a'
> t={_a=1}
> t={_1=1}
> t={a1=1}
示例:表元素引用
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
> t={1,2,3,4,5,6}
-- 使用[1]引用数据,从1开始计数
> t[0]
nil
> t[1]
1
> t[2]
2
-- 不能用t.num
> t.1
stdin:1: syntax error near '.1'
-- key、value只能用t.key引用,不能用t.num
> t={t1=1,t2=2}
> t[1]
nil
> t.t1
1
> t.t2
2
示例:使用索引位添加表元素
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
> t={1,2,3,4,5,6}
-- 初始元素为6个
> #t
6
-- 在索引位8处添加元素
> t[8]=8
> #t
8
-- 在索引位9处添加元素
> t[9]=9
> #t
9
-- 在索引位20处添加元素,#t计算表的长度不精确
> t[20]=20
> #t
9
示例:使用key添加元素
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
> t={1,2,3,4,5,6}
> #t
6
-- 使用t.key添加元素,#t计算长度时不包括在内
> t.key='瓜田李下'
> #t
6
> t.key2='海贼王'
> #t
6
遍历表
pairs:遍历所有的key
ipairs:从1开始遍历,步长为1,跳过不是整数的key,遇到不连续的整数终止
示例:pairs遍历表
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
> t={1,2,3,4,5,6}
> for key,value in pairs(t) do print(key,value) end
1 1
2 2
3 3
4 4
5 5
6 6
-- 添加表元素
> t.key='gtlx'
> for key,value in pairs(t) do print(key,value) end
1 1
2 2
3 3
4 4
5 5
6 6
key gtlx
-- 修改表元素
> t[1]='hzw'
> for key,value in pairs(t) do print(key,value) end
1 hzw
2 2
3 3
4 4
5 5
6 6
key gtlx
示例:ipairs遍历表
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
> t={1,2,3,4,5,6}
-- ipairs遍历输出连续整数key
> for key,value in ipairs(t) do print(key,value) end
1 1
2 2
3 3
4 4
5 5
6 6
-- 添加元素t[8]=8,该元素不输出
> t[8]=8
> for key,value in ipairs(t) do print(key,value) end
1 1
2 2
3 3
4 4
5 5
6 6
-- 初始化表时,后面元素的索引值如果没有指定,自动在原来整数key的基础上增1
-- 遍历输出时,跳过不是整数的key
> t2={1,2,3,4,a=5,6}
> for key,value in ipairs(t2) do print(key,value) end
1 1
2 2
3 3
4 4
5 6
表拼接
table.concat(table、sep、start、end):拼接表,sep分隔符可选、start、end可选
示例:拼接列表式table
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
> t={1,2,3,4,5,6}
-- 拼接表,没有间隔符
> table.concat(t)
123456
-- 使用间隔符拼接
> table.concat(t,'a')
1a2a3a4a5a6
-- 使用数字间隔符拼接,指定起始位置
> table.concat(t,1,4)
41516
-- 使用字符串间隔符,指定起始位置
> table.concat(t,'a',4)
4a5a6
-- 使用未定义变量间隔符
> table.concat(t,a,4)
456
-- 使用已定义的变量间隔符
> a='ttt'
> table.concat(t,a,4)
4ttt5ttt6
示例 2:拼接key、value表
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
> t={a=1,b=2,c=3}
> table.concat(t)
# key、value式表无法拼接
> #table.concat(t)
0
插入元素
table.insert(table, pos, value):在表table中插入元素value,pos指定索引位(可选)
示例
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
-- 在末尾插入元素8
> t={1,2,3,4,5,6}
> table.insert(t,8)
> t[7]
8
-- 在索引位2处插入元素8
> table.insert(t,2,8)
> for key,value in pairs(t) do print(key,value) end
1 1
2 8
3 2
4 3
5 4
6 5
7 6
8 8
-- 在末尾插入元素8
> t2={1,2,3,4,5,6,key='gtlx'}
> table.insert(t2,8)
> t[7]
8
> for key,value in pairs(t2) do print(key,value) end
1 1
2 2
3 3
4 4
5 5
6 6
7 8
key gtlx
删除元素
table.remove(table,pos):移除表中元素,pos指定索引位(可选,默认移除最后一个元素)
示例
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
> t={1,2,3,4,5,6}
-- 默认移除最后一个元素
> table.remove(t)
6
> for key,value in pairs(t) do print(key,value) end
1 1
2 2
3 3
4 4
5 5
-- 移除元素后,后续元素的索引位向前移动
> table.remove(t,1)
1
> for key,value in pairs(t) do print(key,value) end
1 2
2 3
3 4
4 5
> t.key='瓜田李下'
> for key,value in pairs(t) do print(key,value) end
1 2
2 3
3 4
4 5
key 瓜田李下
-- remove方法只会移除索引元素,不会删除key、value对
> table.remove(t)
5
> for key,value in pairs(t) do print(key,value) end
1 2
2 3
3 4
key 瓜田李下
移动元素
table.move(table, start, end, pos, new_table):移动元素,new_table可选
new_table存在:将元素移动到新表里面,table不变
new_table不存在:将start、end之间的元素,从pos位置开始复制到表table里
示例:移动到新表
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
> t={1,2,3,4,5,6}
-- 索引位从2开始计数
> t2={}
> table.move(t,1,4,2,t2)
table: 0x600002248880
> for key,value in pairs(t2) do print(key,value) end
2 1
3 2
4 3
5 4
-- 索引位从2开始计数
> t3={key='瓜田李下'}
> table.move(t,1,4,2,t3)
table: 0x600002240180
> for key,value in pairs(t3) do print(key,value) end
2 1
3 2
4 3
key 瓜田李下
5 4
示例:表里面移动元素
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
> t={1,2,3,4,5,6}
-- 移动1到2处的元素,从索引位6处开始覆盖
> table.move(t,1,2,6)
table: 0x600000234080
> for key,value in pairs(t) do print(key,value) end
1 1
2 2
3 3
4 4
5 5
6 1
7 2
-- 移动1到2处的元素,从索引位10处开始覆盖
> table.move(t,1,2,10)
table: 0x600000234080
> for key,value in pairs(t) do print(key,value) end
1 1
2 2
3 3
4 4
5 5
6 1
7 2
10 1
11 2
元素排序
table.sort(table_name):对表元素排序
示例
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
> t={6,4,8,1,3,5,9}
-- 排序前
> for key,value in pairs(t) do print(key,value) end
1 6
2 4
3 8
4 1
5 3
6 5
7 9
-- 表元素排序
> table.sort(t)
-- 排序后
> for key,value in pairs(t) do print(key,value) end
1 1
2 3
3 4
4 5
5 6
6 8
7 9
pack、unpack
table.pack(value, value2, ...):将元素整合,以table的形式返回
table.unpack(table_name, start, end):返回表中元素,start、end可选
示例
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
-- table.pack(value, value2, value3, ...)
> for key,value in pairs(table.pack(1,2,3)) do print(key,value) end
1 1
2 2
3 3
n 3
-- table.unpack(table, start, end)
> t={1,2,3,4,5,6}
> table.unpack(t)
1 2 3 4 5 6
> table.unpack(t,2,4)
2 3 4
> table.unpack(t,2,8)
2 3 4 5 6 nil nil
> table.unpack(t,-1,8)
nil nil 1 2 3 4 5 6 nil nil