7. Iterators and the generic for
1)迭代器与闭包:
迭代器是一种指针类型的结构,能够遍历集合里的每一个元素。
在Lua中,经常使用上一章提到的返回函数来实现迭代器。
迭代器在泛型for中,能够很方便的访问全部内容,如:
function list_iter(t)
local i = 0
local n = table.getn(t)
return function()
i = i+1
if i <= n then return t[i] end
end
end
访问用:
t = {10,20,30}
iter = list_iter(t)
或者:
for item in list_iter(t) do .... end
2)泛型for的语义:
for <var-list> in <exp-list> do
<body>
end
执行过程:
(1)初始化,计算 <exp-list>,返回迭代函数、状态常量、控制变量
(2)状态量和控制量做为参数,调用迭代函数
(3)返回值赋值给<var-list>
(4)返回nil则结束循环,不然返回(2)
3)无状态迭代器:
指迭代器不保留任何状态(用闭包实现),如table的迭代器ipairs:
for i, v in ipairs(a) do ... end
4)多状态迭代器:
指状态常量、控制变量等保存在迭代器内部(用内部的表或函数递归实现),迭代函数不须要有状态量和控制变量的参数。
好处:能够作到更精确的控制迭代器工做。
坏处:开销大。
5)另外一种迭代器方式:
上述的迭代器,都是返回出当前的访问值,由外部for循环调用。
另外一种方式,是将for循环分装在迭代器内部,经过函数名做为传入参数,完成迭代工做。
相比较而言,方式一更灵活,外部的for能提供更多的操做方式,而方式二更简洁,调用流程更清晰,以下所示:
方式一:
a = {10,20,30}
function list_iter(a)
local i = 0
local n = table.getn(a)
return function()
i = i+1
if i <= n then return a[i] end
end
end
for item in list_iter(a) do --用for方式调用
print(item)
end
方式二:
a = {10,20,30}
function list_iter(a, func)
for i, v in ipairs(a) do func(v) end
end
list_iter(a,print) --仅有一句调用