1、 迭代器与闭包
迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是它知道来自于哪里和将要前往哪里。闭包提供的机制可以很容易实现这个任务。记住:闭包是以恶搞内部函数,它可以访问一个或者多个外部函数的外部局部变量。每一次闭包的成功调用后这些局部变量都保存他们的值。
2、 范性for的语义
范性for的文法如下:
for <var-list>in <exp-list> do
<body>
end
<var-list>是一个或多个以逗号分隔的变量列表,<exp-list>是一个或多个以逗号分割的表达式列表,通常情况下exp-list只有一个值。
for line in io.lines() do
io.write(line,”\”)
end
我们称变量列表中第一个变量为控制变量,其值为nil时循环结束。
3、 无状态的迭代器
无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。
每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值,作为参数被调用,一个无状态的迭代器只利用这个两个值可以获取下一个元素。这种无状态迭代器的典型简单例子是ipairs。
a = {“one”,”two”,”three”}
for i,v ininpairs(a) do
print(i,v)
end
迭代的状态包括被遍历的表和当前的索引下标,ipairs和迭代函数都很简单,我们在Lua中可以这样实现:
function iter (a,i)
i = i=1
local v = a[i]
if v then
return iv
end
end
function ipairs (a)
return iter ,a,0
end
4、 多状态的迭代
很多情况下,迭代器需要保存多个状态需信息而不是简单的状态控制常量和控制变量,最简单的方法是使用闭包,还有一种方法就是将所有的状态信息封装到table内,将table作为迭代器的状态常量。
我们应该尽可能的写无状态的的迭代器,因为这样的循环的时候由for保存状态,不需要创建对象花费的代价,如果不能用无状态的迭代器实现,应尽可能使用闭包,尽可能不要使用table这种方式,因为创建一个闭包的代价要比创建table小,另外lua处理闭包比处理table速度快。
5、 真正的迭代器
有一种方式创建一个在内部完成的迭代器,这样我们使用迭代器的时候就不需要使用循环,我们仅仅使用每一次迭代需要处理的任务作为参数调用迭代器即可。