Lua语言学习之迭代器
2014-08-05 16:41
281 查看
1. 迭代器
迭代器(Iterator)一般用于泛型 for。所谓迭代器就是一种可以遍历(iterate over)一个
集合中所有元素的机制。在 Lua 中,通常将迭代器表示为函数。每调用一次函数,即返回
集合中的“下一个”元素。
例如:
在 while 循环中使用该迭代器:
使用泛型 for 则更为简单:
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 执行它的循环体,随后再次调用迭代器函数,
并重复这个过程。也就是等价于:
2. 无状态的迭代器
所谓无状态的迭代器,如其名,就是一种自身不保存任何状态的迭代器。典型的例子就是
ipairs,它可以用来迭代一个数组的所有元素。
函数 pairs 和 ipairs 类似,也是用于遍历一个 table 中的所有元素。不同的是,它的迭代器函数
是 Lua 中的一个基本函数 next 。
迭代器(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 。
相关文章推荐
- Lua语言学习(一)------Lua语言闭包代替范性for语义的迭代器的原理
- 转 LUA语言学习教程
- lua语言中闭包的学习心得
- Lua学习——闭包、迭代器
- lua语言学习(2.0)(终章)
- lua语言的学习(一.2)
- LUA语言学习教程 [转]
- Lua语言学习之表达式和语句
- Lua脚本语言入门学习其应用教程
- Lua学习——闭包、迭代器
- em-lua语言入门学习视频。
- Lua游戏脚本语言入门学习指导
- lua语言学习笔记
- 转 LUA语言学习教程
- lua学习笔记之-语言基础
- LUA语言学习教程
- Lua游戏脚本语言入门学习指导 .
- eLua学习第一课:和Lua脚本语言的第一次亲密接触
- lua语言的学习(一)
- Lua语言学习之初探索