11. Lua中ipairs和pairs的区别

  1. 11. ipairs和pairs的区别
    1. 11.1 题目
    2. 11.2 答案

11. ipairs和pairs的区别


11.1 题目

.ipairs和pairs的区别


11.2 答案

正常情况下,ipairspairs在遍历数组时没有任何区别。以下是一个示例代码:

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

当我们使用自定义的键值时,通过pairsipairs的输出结果会有所不同。以下是一个示例:

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会依据键值从1开始加1递增遍历相应的table值。而pairs则能够遍历表中全部的键值,并且还能够返回nilipairs不能返回nil,仅能返回数字0,遇到nil则循环退出。它仅能遍历到表中出现的第一个不是整数的键值。

当我们获取table的长度时,无论是使用#还是table.getn,都会在索引中断的地方停止计数,而导致无法正确取得table的长度。要正确求得table的长度,可以参考以下代码:

function tableLength(tbl)
    local count = 0
    for _ in pairs(tbl) do
        count = count + 1
    end
    return count
end

local tbl2 = {1, 2, 3, nil, 5}
print("Table长度为:", tableLength(tbl2)) -- 输出5

结论:遍历table或array时,如果键值是非数字,请使用pairs迭代遍历。



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏