Lua中for循环提供了对数字型和非数字型(泛型)的支持,其中对数字型的支持已经在之前的文章“Lua教程-流程控制”中进行说明,在这主要讲解下泛型for迭代器,依据table的结构分为两种:
- 数字型table
索引key全部为数字。 - 非数字型table
索引可以为数字或字母
而针对这两种不通类型的table可以使用的函数有ipairs(t)和pairs(t),接下来看看这两个函数使用和区别:
ipairs(t)
可以遍历索引值为数字的table,格式为:
for k,v in ipairs(t) do
---do something
end
local table1 = {"a","b","c","d","e","f"}
for i, v in ipairs(table1) do
print(i , v)
end
以上示例定义一个table,默认索引值从1开始,输出结果为:
1 a
2 b
3 c
4 d
5 e
6 f
再来看两个示例同样定义一个table但是采用显示声明索引值:
- 索引值全部为数字
local table2 = {[1] ="a" , [2] = "b" , [4] = "c"}
for i, v in ipairs(table2) do
print("i=",i,"v=",v)
end
输出结果却为:
i= 1 v= a
i= 2 v= b
- 索引值为数字和字母
local table2 = {[1] ="a" ,["hello"] = "aaaaaaaaaa" , [2] = "b" , [4] = "c"}
for i, v in ipairs(table2) do
print("i=",i,"v=",v)
end
输出结果与示例1一样为:
i= 1 v= a
i= 2 v= b
由此可以总结出ipairs()函数是按照连续数值型索引的值,而对于非数字型的索引值则不输出。
pairs(t)
可以遍历混合型的table,格式为:
for k,v in pairs(t) do
---do something
end
改造ipairs示例2的代码。
local table2 = {[1] ="a" ,["hello"] = "aaaaaaaaaa" , [2] = "b" , [4] = "c"}
for i, v in pairs(table2) do
print("i=",i,"v=",v)
end
输出结果为:
i= 1 v= a
i= 2 v= b
i= 4 v= c
i= hello v= aaaaaaaaaa
所有的元素均被输出,进一步观察发现输出的顺序并非是按照table中定义的顺序输出的,而是无序的。
再来看看如果为数值型的table,pairs(t)函数是否支持。
local table1 = {"a","b","c","d","e","f"}
for i, v in pairs(table1) do
print(i , v)
end
输出结果为:
1 a
2 b
3 c
4 d
5 e
6 f
可以正常输出,再来看下显式声明索引值是如何输出的。
local table3 = {[1] ="a" ,[2] = "b" ,[5] = "c" ,[8] = "d", [4] = "e"}
for i, v in pairs(table3) do
print("i=",i,"v=",v)
end
输出结果为:
i= 2 v= b
i= 8 v= d
i= 1 v= a
i= 4 v= e
i= 5 v= c
同样也可以输出,并且也是无序的。
总结
看过一篇文档说pairs(t)函数的输出顺序是先输出数值型索引元素,再输出非数值型的元素,但根据上边的示例可以看出并不是这样而是无序输出。本教程使用的是5.1版本没有在其他版本上测试,不知道是不是版本原因。
由上述示例可以看出两个函数的区别:
- ipairs(t)函数只能是数值型索引table,输出结果为连续数值型索引,若有中断则只输出连续的元素。
- pairs(t)函数可以支持纯数值型索引和混合索引table,且无序输出。