lua系统学习06-Table构造函数

19 篇文章 0 订阅
14 篇文章 0 订阅

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

j结果;

输入
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值