Lua中pair和ipair的区别?

Lua中pair和ipair的区别?

二者都是Lua中内置的迭代器,可以对数组或table进行遍历。

在正常的数组或table的遍历中,二者没有区别。

 
tableNormal={"this","is","a","array"}
--使用 pairs 遍历
for key,val in pairs(tableNormal) do
print(key,'==',val)
end

遍历结果:

image-20240308194558419

 
--使用 ipairs遍历
for key,val in ipairs(tableNormal) do
print(key,'==',val)
end

遍历结果:

https://www.bilibili.com/read/cv32911818/
https://www.bilibili.com/read/cv32909725/
https://www.bilibili.com/read/cv32910298/
https://www.bilibili.com/read/cv32915294/
https://www.bilibili.com/read/cv32915343/
https://www.bilibili.com/read/cv32915382/
https://www.bilibili.com/read/cv32915437/
https://www.bilibili.com/read/cv32915539/
https://www.bilibili.com/read/cv32915608/
https://www.bilibili.com/read/cv32915669/
https://www.bilibili.com/read/cv32915709/
https://www.bilibili.com/read/cv32915754/
https://www.bilibili.com/read/cv32915799/
https://www.bilibili.com/read/cv32915836/
https://www.bilibili.com/read/cv32915868/
https://www.bilibili.com/read/cv32915947/
https://www.bilibili.com/read/cv32915997/
https://www.bilibili.com/read/cv32916031/
https://www.bilibili.com/read/cv32916905/
https://www.bilibili.com/read/cv32916958/
https://www.bilibili.com/read/cv32917039/
https://www.bilibili.com/read/cv32917159/
https://www.bilibili.com/read/cv32917293/
https://www.bilibili.com/read/cv32917398/
https://www.bilibili.com/read/cv32917505/
https://www.bilibili.com/read/cv32917576/
https://www.bilibili.com/read/cv32917611/
https://www.bilibili.com/read/cv32917758/
https://www.bilibili.com/read/cv32917808/
https://www.bilibili.com/read/cv32911944/
https://www.bilibili.com/read/cv32912015/
https://www.bilibili.com/read/cv32912052/
https://www.bilibili.com/read/cv32912077/
https://www.bilibili.com/read/cv32912177/
https://www.bilibili.com/read/cv32912219/
https://www.bilibili.com/read/cv32912253/
https://www.bilibili.com/read/cv32912326/
https://www.bilibili.com/read/cv32914739/
https://www.bilibili.com/read/cv32914734/
https://www.bilibili.com/read/cv32914727/
https://www.bilibili.com/read/cv32914721/
https://www.bilibili.com/read/cv32914713/
https://www.bilibili.com/read/cv32914704/
https://www.bilibili.com/read/cv32914701/
https://www.bilibili.com/read/cv32914693/
https://www.bilibili.com/read/cv32914689/
https://www.bilibili.com/read/cv32914686/
https://www.bilibili.com/read/cv32914684/
https://www.bilibili.com/read/cv32913919/
https://www.bilibili.com/read/cv32913885/
https://www.bilibili.com/read/cv32913866/
https://www.bilibili.com/read/cv32913831/
https://www.bilibili.com/read/cv32913810/
https://www.bilibili.com/read/cv32913780/
https://www.bilibili.com/read/cv32913743/
https://www.bilibili.com/read/cv32913708/
https://www.bilibili.com/read/cv32913653/
https://www.bilibili.com/read/cv32913618/
https://www.bilibili.com/read/cv32913596/
https://www.bilibili.com/read/cv32913583/
https://www.bilibili.com/read/cv32913565/
https://www.bilibili.com/read/cv32913545/
https://www.bilibili.com/read/cv32913526/
https://www.bilibili.com/read/cv32913503/
https://www.bilibili.com/read/cv32913463/
https://www.bilibili.com/read/cv32913435/
https://www.bilibili.com/read/cv32913420/
https://www.bilibili.com/read/cv32913400/
https://www.bilibili.com/read/cv32913390/
https://www.bilibili.com/read/cv32913371/
https://www.bilibili.com/read/cv32913350/
https://www.bilibili.com/read/cv32913325/
https://www.bilibili.com/read/cv32913301/
https://www.bilibili.com/read/cv32913270/
https://www.bilibili.com/read/cv32913241/
https://www.bilibili.com/read/cv32913194/
https://www.bilibili.com/read/cv32913165/
https://www.bilibili.com/read/cv32913147/
https://www.bilibili.com/read/cv32913129/
https://www.bilibili.com/read/cv32913118/
https://www.bilibili.com/read/cv32913097/
https://www.bilibili.com/read/cv32913083/
https://www.bilibili.com/read/cv32913058/
https://www.bilibili.com/read/cv32912741/
https://www.bilibili.com/read/cv32912718/
https://www.bilibili.com/read/cv32912694/
https://www.bilibili.com/read/cv32912527/
https://www.bilibili.com/read/cv32916868/
https://www.bilibili.com/read/cv32917248/
https://www.bilibili.com/read/cv32917859/
https://www.bilibili.com/read/cv32918364/
https://www.bilibili.com/read/cv32918180/
https://www.bilibili.com/read/cv32918205/
https://www.bilibili.com/read/cv32918220/
https://www.bilibili.com/read/cv32918254/
https://www.bilibili.com/read/cv32918382/
https://www.bilibili.com/read/cv32918422/
https://www.bilibili.com/read/cv32918454/
https://www.bilibili.com/read/cv32918499/
https://www.bilibili.com/read/cv32918777/
https://www.bilibili.com/read/cv32918805/
 

image-20240308194625680

二者没有任何差别!

之所以说是正常的数组,是因为索引是连续的,数值都是存在的,不存在nil的情况。

而如果索引不连续,或索引类型不是num,那么二者就显现出差别。再看,

  1. 索引类型为num,但不连续
 
table1={}
table1[1]="Hello"
table1[2]="Tony!"
table1[3]="This"
table1[6]="is"
--使用ipairs 遍历
for key,val in ipairs(table1) do
print(key,'==',val)
end

结果:

image-20240308200218112

 
--使用pairs遍历
for key,val in pairs(table1) do
print(key,'==',val)
end

结果:

image-20240308200300457

显然,使用pairs能对数组内容整体遍历。而ipairs只会访问连续的数字索引内容。

查看一下table长度(实际长度为4):

 
print("table1的长度",#table1)

image-20240308203310667

好,我们再看一个情况:

 
table2={[2]="welcome",[3]="to",[4]="my",[5]="blog"}
print("----------------ipairs-------------------------")
for key,val in ipairs(table2) do
print(key,"==",val)
end

猜猜会打印什么?

什么也没有打印!可见ipairs只能从索引为1的位置遍历,且只能访问连续的索引区间。

image-20240308201107204

当然,pairs可以直接遍历咯!

 
for key,val in pairs(table2) do
print(key,"==",val)
end

image-20240308201355047

 
--查看数组长度
print("table2长度====",#table2)

image-20240308202315426

可见长度的获取和ipairs有关。

我们可以自定义获取数组长度的函数

 
function tableSize(table)
local size=0
for k,v in pairs(table) do
size=size+1
end
return size
end
print("table2长度====",tableSize(table2))

image-20240308202717573

  1. 对于索引类型为非nums的table来说,若想遍历直接使用pairs即可。

     
      
    tableAbnormal={[1]="TonyCode",index1="index1",i2="index2",s3="s3"}
    print("=============ipairs的执行结果=============")
    for i, v in ipairs(tableAbnormal) do
    print(i, '=', v)
    end
    print("=============pairs的执行结果=============")
    for i, v in pairs(tableAbnormal) do
    print(i, '=', v)
    end

    image-20240308201916520

    image-20240308201852055

    综上可知,ipairs适用于数值索引且连续的数组或table的遍历,而pairs对于不同元素类型的数组都适用。但是能使用ipairs尽可能使用,其性能更好。

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值