Lua语言学习之迭代器


1. 迭代器

迭代器(Iterator)一般用于泛型 for。所谓迭代器就是一种可以遍历(iterate over)一个

集合中所有元素的机制。在 Lua 中,通常将迭代器表示为函数。每调用一次函数,即返回

集合中的“下一个”元素。

例如:

function values ( t ) 
	local i = 0
	return function ( ) i = i + 1; return t [ i ] end
end

在 while 循环中使用该迭代器:

t = { 20,30,12 }
iter = values ( t )
while true do
	local element = iter ( )
	if element == nil then
	break 
    end
    print( element )
end


使用泛型 for 则更为简单:

for element in values( t ) do
	print ( element )
end

2. 泛型 for 的语义

泛型 for 在循环过程内部保存了迭代器函数。实际上它保存着三个值:一个迭代器函数、一个

恒定状态(invariant state)和一个控制变量(control variable)。

泛型 for 的语法:

for < var-list > in < exp-list > do

<body>

end

  < var-list > 是一个或多个变量名的列表,以逗号分隔;

< exp-list > 是一个或多个表达式的列表,以逗号分隔。

  变量列表的第一个元素称为“控制变量”,当它为 nil 时循环结束。

  for 做的第一件事就是对 in 后面的表达式求值。这些表达式应该返回三个值供 for 保存:

迭代器函数、恒定状态和控制变量的初值。在初始化步骤之后,for 会以恒定状态和控制

变量来调用迭代器函数。然后,for 将迭代器函数的返回值赋予变量列表中的变量。

如果第一个返回值为 nil,那么循环终止。否则,for 执行它的循环体,随后再次调用迭代器函数,

并重复这个过程。也就是等价于:

do 
	local _f, _s, _var = <exp-list>
	while true do
		local var_1, ... , var_n = _f ( _s, _var )
		_var = var_1
		if _var == nil then break end
		<block>
	end
end


2. 无状态的迭代器

所谓无状态的迭代器,如其名,就是一种自身不保存任何状态的迭代器。典型的例子就是

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

函数 pairs 和 ipairs 类似,也是用于遍历一个 table 中的所有元素。不同的是,它的迭代器函数

是 Lua 中的一个基本函数 next 。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值