Lua程序设计随笔(6)

泛型for的语义

在循环中每次调用迭代器每次都要创建一个新的closure,或者在循环之前定义一个closure,这样是有些麻烦的
在泛型for内部会保存迭代器函数,这样就不会有多传造closure了
泛型for的语法如下

for <var-list> in <exp-lisr> do
	<body>
end

其中, var-list 是一个或者多个变量列表,用逗号分隔开来,exp-list是一个或者多个表达式的列表,同样逗号隔开。

for k,v in pairs(t) do
	print(l,v);
end

其中,第一个元素称呼控制变量,在循环中过程中,该值不会为nil,如果为nil了这个循环就结束了。
for做的第一件事就是对in后面的表达式求值,这些表达式返回三个值保存在for中,迭代器函数,恒定状态,控制变量的初值。
例如

function addNum(a)
	local i=0;
	return function ()
				i=i+1;
				return a[i];
			end
end;

a={1,2,3,4,5};
for item in addNum(a) do
	print(item);
end

在这个例子中,形参a是恒定状态,控制变量初值是item,迭代器函数是 addNum
直到item的值为nil则循环结束

无状态的迭代器

如字面的意思,迭代器本身不保存任何状态,如ipairs函数,我们可以这样看待

local function iter (a,i)
	i=i+1;
	local v=a[i]
	if v then
		return i,v;
	end
end

function ipairs (a)
	return iter,a,0
end

a={"one","two","three"};
for i,v in ipairs(a) do
	print(i,v);
end

可以看出,实际上iter中的v值没有保存任何状态;
变量控制变量是从外部传入的而非内部构造的

复杂状态的迭代器

在实际应用中,迭代器需要保存许多的状态,但是泛型for却只提供一个恒定状态和控制变量用于保存状态
这时将需要的状态保存在table或者closure中的话,那么存储需要的状态了

//看的还是有点蒙圈

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值