迭代器(
iterator)是一个对象,能够遍历标准容器格式里面的数据,
在Lua中迭代器是一种支持指针类型的结构,他可以遍历集合里面的元素。
泛型for迭代器
泛型for迭代器在自己的内部保留有迭代函数,泛型for迭代器也提供了键值对,具体格式如下:
for k,v pairs(table) do
print("this iterator")
end
其中k,v是变量列表,pairs是迭代函数。下面是实例
array = {"one","two"}
for k,v in ipairs(array) do
print(v)
end
运行结果:
one
two
在Lua中我们通常使用函数来描述迭代器,每调用一次迭代器,就返回所遍历集合的下一个元素,Lua中迭代器有两种分类:无状态迭代器和多状态的迭代器
无状态迭代器
无状态迭代器指的是在循环过程中,不保留任何状态的迭代器,这样我们就可以避免创建闭包所花费的代价。
典型的无状态迭代器就是:ipairs
现在我们实现一个求数字平方的迭代器:
function mysquare(Maxnumber,Index)
if Index < Maxnumber then
Index = Index + 1
return Index,Index*Index
end
end
for i,v in mysquare,3,0 do
print(i,v)
end
运行结果:
1 1
2 4
3 9
我们也可以去实现一下迭代函数:ipairs
function myiter(table,index)
index = index +1
local a = table[index];
if a then
return index,a
end
end
function myipairs(table)
return myiter,table,0
end
array = {"one","two"}
for k,v in myipairs(array) do
print(k,v)
end
运行结果:
1 one
2 two
多状态的迭代器
以下实例我们创建了自己的多状态迭代器
array = {"one","two"}
function myiter(table)
local index = 0
local count = #table
return function()
index = index + 1
if index <= count then
return table[index]
end
end
end
for v in myiter(array) do
print(v)
end
运行结果:
one
two