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

今天开始迭代器的学习,看了《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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值