Lua教程-泛型for迭代器

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但是采用显示声明索引值:

  1. 索引值全部为数字
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
  1. 索引值为数字和字母
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,且无序输出。

    Lua教程-泛型for迭代器_第1张图片

你可能感兴趣的:(Lua,Lua基础教程)