lua系统学习06-Table构造函数
Table构造函数
最简单的构造器是“{}”,用来创建一个空表。可以直接初始化数组:
可以使用表构造一个链表:
list = nil
for line in io.lines() do
if line=="0" or line=="false" then
break;
end
list = {nextVar = list, valueVar = line}
end
l = list
while l do
print(l.valueVar)
l = l.nextVar
end
结果:
输入
2
5
6
54
0
输出:
54
6
5
2
列表可以有多种构造形式 上面的{变量key=值,变量key2=值}也是一种形式。
每次循环构造一个表 list = {nextVar = list, valueVar = line}
它的nextVar键引用着上一次构造的表的地址。
valueVar保存当前输入的数据。
这样呢,就形成一个链表。
最后我们将他反序输出。
while l do
每次循环会取到next 当next为空 表示当前是头指针,完成while循环。
table嵌套
table也可以嵌套使用
测试代码:
function embedTable()
list={1,{key1="1",key2="2"},{key3="3",key4="4"}}
for i = 1, table.maxn(list) do
print(list[i])
print(" 类型:".. type(list[i]))
end
end
t={}
print(type(t))
embedTable()
print("Finish")
输出结果:
table
1
类型:number
table: 00B89BC0
类型:table
table: 00B89A58
类型:table
Finish
根据结果来看table是支持内嵌的。
下面代码查看是否能访问到内嵌的列表
function embedTable()
list={1,{key1="1",key2="2"},{key1="3",key2="4"}}
for i = 1, table.maxn(list) do
print(list[i])
typeStr=type(list[i]);
if typeStr=="table" then
res=list[i][1]
res= tostring(res)
print( list[i]["key1"])
else
print("\r\n")
end
print(" 类型:".. typeStr)
end
end
t={}
print(type(t))
embedTable()
print("Finish")
输出结果
table
1
类型:number
table: 00B79860
1
类型:table
table: 00B79928
3
类型:table
Finish
代码中尝试直接用数字索引访问每个内嵌table的元素,结果访问失败。后面总结发现凡是被特定的key指定了之后,数字索引就不会默认指定了。如{key=1,key2=2},后面没有键值指定的会按照数值索引作为键值排序。
测试代码:
embedTableList={key1=1,2,3}
print(embedTableList[1])
print(embedTableList[2])
print(embedTableList[3])
测试结果:
2
3
nil
在lua中一般写法是不能使用负数做索引,也不能用运算符或表达式做索引。
lua为了这个 提供了另一种写法。
索引方括号包裹运算符 来初始化索引值。
默认写法不支持运算符索引
使用方括号包裹运算符
function tableCtorExtra()
ctorExtra={[1+1]=1}
print(ctorExtra[1+1])
end
tableCtorExtra()
end
字符串+做索引也不行
最终构造写法:
function tableCtorExtra()
ctorExtra={[1+1]=1,["+"]=2,['/']=3,['-']=4,['=']=4}
print(ctorExtra[1+1])
end
tableCtorExtra()
这种方括号的写法 非常灵活。统一方括号的写法可以避免后续出现需要运算符做索引,简单的来说 就是将运算符先转成字符串 然后字符串在转成变量。实际上看是内部做了一个处理把运算符当作变量去用。(运算符属于lua的保留关键字理论上是不允许使用的,但是它内部肯定处理后把运算符转成其他了)。
关于table构造函数中的其他特性
function tableCtorExtra()
ctorExtra={[1+1]=1,["+"]=2,['/']=3,['-']=4,['=']=4}
print(ctorExtra[1+1])
ctorExtra={[1+1]=1,}
print(ctorExtra[1+1])
ctorExtra={[1+1]=1;"x","y";x=1,y=1;}
print(ctorExtra[1+1])
end
1
1
y
补充:
可以看到上面的输出结果 第三条输出 [1+1]=>2
两个索引值冲突了,对于冲突的索引 在lua中总是以构造列表中的最后一个索引构造初始化。
而对于像上面这样 方括号指定的索引与纯数字索引 冲突,lua总是以直接使用数字索引的作为最终结果。
示例1:(对于冲突的索引 在lua中总是以构造列表中的最后一个索引构造初始化。)
function funcName2()
local t1={a="str1",b="str2",a="str4",[3]="str5"}
print(t1.a)
end
funcName2()
输出:(可以看到前面构造的str1被后面构造的str4覆盖) str4
示例2:(方括号指定的索引与纯数字索引 冲突,lua总是以直接使用数字索引的作为最终结果。)
local t1={"str1","str2","str3",[3]="str4"}
function funcName(t)
for i = 1, 3 do
print(t[i])
end
end
funcName(t1);
输出:(可以看到后面构造的str4被str3覆盖)
str1
str2
str3
来源:麦瑞克博客
链接:https://www.playcreator.cn/archives/programming-life/1851/
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!