11. ipairs和pairs的区别
11.1 题目
.ipairs和pairs的区别
11.2 答案
正常情况下,ipairs
和pairs
在遍历数组时没有任何区别。以下是一个示例代码:
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
当我们使用自定义的键值时,通过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
会依据键值从1开始加1递增遍历相应的table值。而pairs
则能够遍历表中全部的键值,并且还能够返回nil
。ipairs
不能返回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