一、普通迭代器
书写方式为:
local function foo(t)
local i = 0
return function()
i = i + 1
return t[i]
end
end
t = {1,2,3,4,5,6,7}
iter = foo(t)
while true do
local element = iter()
if element == nil then break end
print(element)
end
解释:
1、首先创建一个迭代器工厂 foo ,就是用来产生一个迭代器的。
2、iter = foo(t) 的作用是创建一个迭代器
3、由于closure 能够保存非局部的变量,因此,iter 中保存着用于迭代计数的变量 i
4、在 while 循环中,每次调用 iter 就会使 i 的值加一,然后返回 table t 中的一个元素,知道返回的值为 nil 时退出循环。
二、与泛型 for 一起用的迭代器
书写方式为:
local function foo(t)
local i = 0
return function()
i = i + 1
return t[i]
end
end
t = {1,2,3,4,5,6,7}
for value in foo(t)do
print(value)
end
解释:
1、创建一个迭代器工厂,用来产生一个迭代器
2、使用泛型 for 来迭代 table t
3、泛型 for 迭代的原理:
(1)泛型 for 首先求取 in 后面的表达式的值,这时就会创建一个迭代器函数,只求一次值
(2)泛型 for 会保存三个值,分别是迭代器函数,恒定状态和控制变量,并且在每次迭代的时候用恒定状态和控制变量来调用迭代器函数,例如 f 是一个迭代器函数,s 是恒定状态,a 是控制变量,每次迭代的时候就会调用 f(s,ai) ,i 表示第 i 次调用时 a 的值
(3)f(s,ai) 调用的返回值会用来赋值给变量列表中的变量,当返回的第一个变量的值为 nil 时,循环结束
三、无状态迭代器
书写方式为:
local function iter(t,i)
i = i + 1
local value = t[i]
if value then
return i,value
end
end
function foo(t)
return iter,t,0
end
t = {1,2,3,4,5,6,7}
for i,v in foo(t)do
print(i,v)
end
解释:
1、in 后面foo(t) 的调用返回三个值,分别是迭代器函数 iter,恒定状态 t,控制变量 i(初始值为0),foo(t) 也只调用一次
2、在迭代的过程中,始终调用iter(t,i),直到 iter 函数的返回值中的第一个值为 nil
3、为什么该迭代器相较前面的迭代器就被成为无状态的迭代器?
原因是该迭代器不保存任何状态信息,没有创建 closure,直接将迭代器函数,恒定状态和控制变量返回给泛型 for 循环,由 for 循环保存状态信息
四、有多个状态的迭代器
书写方式为:
local function iter(state)
if state.state1 then
state.controller = state.controller + 1
return state.inf[state.controller]
end
end
function foo(t)
local state = {inf = t,controller = 0,state1=true}
return iter,state
end
t = {1,2,3,4,5,6,7}
for value in foo(t) do
print(value)
end
解释:
这个迭代器仅仅是将多个状态放在了一个 table 中,原理和前一个迭代器是一样的,就不在赘述了。
就先说到这~