今天开始迭代器的学习,看了《Programming in Lua 》这一章,看了2遍才稍微弄懂了一点儿,在这里与大家一起分享。
一、迭代器就是遍历集合的元素
这是一个简单的迭代器程序,用途是遍历t这个table中的值
function value(t)
local i = 0
return function()
i = i + 1
return t[i]
end
end
调用迭代器:
t = {10,20,30}
local iter = value(t) -- 创建迭代器
while true do
-- 尽可能的使用局部变量,调用迭代器
<span style="white-space:pre"> </span>local e = iter()
<span style="white-space:pre"> </span>if e then
<span style="white-space:pre"> </span>print(e)
<span style="white-space:pre"> </span>else
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>end
end
创建一个closure(迭代器)后,保存在变量iter中,此后循环调用时就不会产生新的closure。
二、泛型for语句
首先,for对in后面的表达式求值,表达式返回迭代器函数、恒定状态和控制变量的初值给for保存。然后,for会以恒定状态和控制变量来调用迭代器函数。
最后,for执行循环体,直到迭代器函数的第一个返回值为nil。循环结束。
又是上面的例子,这次是用泛型for调用迭代器:
t = {10,20,30} --数组
for v in value(t) do
print(v)
end
相当于:
do
--1. for对in后面的表达式求值,返回值:_f:迭代函数 _s:恒定状态 _var:控制变量的初始值
local _f,_s,_var = value(t)
--2. for进入循环状态
while true do
local v = _f(_s,_var) --调用迭代函数
_var = v
if _var == nil then
break --3. 结束循环
end
print(v)
end
end
三、迭代器接受函数作为参数,在其内部的循环中调用函数
这段代码表示在遍历当前文件中所有的单词:
function allwords(f)
for line in io.lines() do
-- io.lines 迭代函数:从文件中读取一行
for word in string.gmatch(line,"%w+") do
--string.gmatch迭代函数:从line中查找单词
f(word)
end
end
end
allwords(print)