Lua笔记之Lua迭代器

一、普通迭代器

  书写方式为:

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 中,原理和前一个迭代器是一样的,就不在赘述了。







就先说到这~

 
 

 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/zhc_futrue/article/details/79052671