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

 

 

作者:Miracle
来源:麦瑞克博客
链接:https://www.unitymake.com/archives/programming-life/1851
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!
THE END
分享
打赏
海报
lua系统学习06-Table构造函数
Table构造函数 最简单的构造器是“{}”,用来创建一个空表。可以直接初始化数组: 可以使用表构造一个链表: list = nil for line in io.lines() do if li……
<<上一篇
下一篇>>
文章目录
关闭
目 录