Lua中pairs和ipairs的差别

正常情况下,使用pairs和ipairs遍历table或数组,没有任何的区别,如下示例所示:

local tbl1 = { "apple", "pear", "orange", "grape" }
print("=============ipairs的执行结果=============")
for i, v in ipairs(tbl1) do
    print(i, '=', v)
end
print("=============pairs的执行结果==============")
for i, v in pairs(tbl1) do
    print(i, '=', v)
end

—执行结果如下:

=ipairs的执行结果=
1 = apple
2 = pear
3 = orange
4 = grape
=pairs的执行结果==
1 = apple
2 = pear
3 = orange
4 = grape

看一下自定义的key值,通过pairs和ipairs输出会是什么情况呢,如下所示:

local tbl2 = {}
tbl2[1] = "1"
tbl2[2] = "2"
tbl2[3] = "3"
tbl2[5] = "5"
print("=============ipairs的执行结果=============")
for i, v in ipairs(tbl2) do
    print(i, '=', v)
end
print("=============pairs的执行结果=============")
for i, v in pairs(tbl2) do
    print(i, '=', v)
end
print('tbl2的长度为:', #tbl2)--长度输出为3,实际上数组中的长度是4

执行结果如下所示:

=ipairs的执行结果=
1 = 1
2 = 2
3 = 3
从执行结果发现,最后一个元素没有了
=pairs的执行结果=
1 = 1
2 = 2
3 = 3
5 = 5
tbl2的长度为: 3

从以上可以发现,其实ipairs会依据key的数值从1开始加1递增遍历相应的table[i]值。 而pairs则能够遍历表中全部的key,而且除了迭代器本身以及遍历表本身还能够返回nil,可是ipairs则不能返回nil,仅仅能返回数字0,遇到nil则循环退出。 它仅仅能遍历到表中出现的第一个不是整数的key.

再看下例子,验证一下:

local tbl3 = {2, s1 = "s1", s2 = "s2", s3 = "s3" }

print("=============ipairs的执行结果=============")
for i, v in ipairs(tbl3) do
    print(i, '=', v)
end
print("=============pairs的执行结果=============")
for i, v in pairs(tbl3) do
    print(i, '=', v)
end
=============ipairs的执行结果=============
1   =   2
=============pairs的执行结果=============
1   =   2
s1  =   s1
s3  =   s3
s2  =   s2

结论:遍历table或array时,如果key是非数字,请使用pairs迭代遍历。
当我们获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值