Lua 学习笔记(六) —— 迭代器和泛型for

来源:互联网 发布:sop流程图软件 编辑:程序博客网 时间:2024/06/07 23:37

今天开始迭代器的学习,看了《Programming in Lua 》这一章,看了2遍才稍微弄懂了一点儿,在这里与大家一起分享。


一、迭代器就是遍历集合的元素

这是一个简单的迭代器程序,用途是遍历t这个table中的值

function value(t)local i = 0return function()i = i + 1return t[i]endend

调用迭代器:

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>endend
创建一个closure(迭代器)后,保存在变量iter中,此后循环调用时就不会产生新的closure。


二、泛型for语句

首先,for对in后面的表达式求值,表达式返回迭代器函数、恒定状态和控制变量的初值给for保存。
然后,for会以恒定状态和控制变量来调用迭代器函数。

最后,for执行循环体,直到迭代器函数的第一个返回值为nil。循环结束。

又是上面的例子,这次是用泛型for调用迭代器:

t = {10,20,30} --数组for v in value(t) doprint(v)end
相当于:

do--1. for对in后面的表达式求值,返回值:_f:迭代函数 _s:恒定状态 _var:控制变量的初始值local _f,_s,_var = value(t)--2. for进入循环状态while true dolocal v = _f(_s,_var) --调用迭代函数_var = vif _var == nil then  break  --3. 结束循环endprint(v)endend


三、迭代器接受函数作为参数,在其内部的循环中调用函数

这段代码表示在遍历当前文件中所有的单词:

function allwords(f)for line in io.lines() do-- io.lines 迭代函数:从文件中读取一行for word in string.gmatch(line,"%w+")  do--string.gmatch迭代函数:从line中查找单词f(word)endendendallwords(print)

0 0