lua中的迭代器与泛型for

任何一种结构,只要允许你遍历集合中所有元素的都可称之为迭代器。lua中常常使用函数来描述迭代器,每次调用该函数都返回集合的下一个元素。每一个迭代器都需要保存一些状态来知道当前处于什么位置和如何进行下一次迭代。对于这样的任务,闭包提供了很好的机制来完成。一个典型的闭包结构包含两个函数:一个是闭包自身,一个是创建闭包的工厂。

例如,我们可以写过简单的list迭代器,让他仅仅返回值。

function values( t )

local i = 0;

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

end

tb = {33, 44, 55}

for v in values(tb) do

print(v)

end

泛型for簿记所有迭代循环,首先调用迭代工厂,并内部保存迭代函数。每次迭代时调用新的迭代函数。但迭代器返回nil循环结束。

上面的迭代器有个瑕疵:需要创建一个闭包。创建闭包是需要代价的,只是大部分情况下都没问题,然而有些情况却是不能容忍这个代价的。这时的解决方法是使用泛型for。泛型for本身保存迭代状态,包括迭代函数,状态常量,控制变量,因此不必付出闭包的代价,称这种迭代器为无状态迭代器。

泛型for的语法:

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

<body>

end

执行过程:

1.初始化迭代函数,状态常量,控制变量,不足补nil,多出忽略。

2.状态常量,控制变量作为参数调用迭代函数。

3.将迭代函数返回的值付给变量列表。

4.如果返回的第一个值为nil,则循环结束,否则执行循环体。

5.回到第2步。

如果遇到需要保存多个状态,还有种方法是将所有状态封装到表中。实际上,我们不推荐这么写。因为创建闭包的代价比创建表的要小,而且lua处理闭包的速度更快些。还有更强大更复杂的方式是使用协同来创建迭代器。

时间: 2024-11-03 21:15:39

lua中的迭代器与泛型for的相关文章

lua学习之迭代器与泛型for第一篇

迭代器与泛型 for 1 迭代器与 closure 「迭代器」是一种可以遍历一种集合中的所有元素的机制 在 lua 中通常将迭代器表示为函数 每调用一次函数,即返回集合中的「下一个」元素 每个迭代器都需要在每次成功调用之间保存一些状态 这样就知道它现在所在的位置以及如何步进到一下位置 一个 closure 就是一种可以访问其外部嵌套环境中的局部变量的函数 这些变量可用于在成功调用之间保持状态值 从而使 closure 可以记住它在一次遍历中所在的位置 创建一个 closure 必须创建它的「非局

Lua迭代器和泛型for

1.迭代器与closure 在lua中,迭代器通常为函数,每调用一次函数,会返回集合中的下一个元素.每个迭代器在成功调用的时候,都需要保存一些状态,closure(闭包)完美为迭代器运用而生. function values(t) local i=0 return function() --匿名函数 i=i+1 return t[i] end end t1 ={10, 20, 30} it=values(t1) --创建闭包变量的参数为函数参数 while true do local eleme

二、Lua迭代器与泛型for

注:本文转自Stephen_Liu的文章:Step By Step(Lua迭代器和泛型for).http://www.cnblogs.com/stephen-liu74/archive/2012/06/20/2413799.html 1. 迭代器与Closure:    在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置和下一次遍历时的位置.从这一点看,Lua中closure机制为此问题提供了语言上

lua迭代器和泛型for浅析

(一) 首要概念要理清: 1. 在lua中,函数是一种"第一类值",他们具有特定的词法域."第一类值"表示在lua中函数与其他传统类型的值(例如数字和字符串)具有相同的权利. 2. 函数可以存储到变量中(无论全局变量还是局部变量)或table中,可以作为实参传递给其他函数,还是作为其他函数的返回值; 3. "词法域"是指:一个函数可以嵌套在另一个函数中,内部的函数可以访问外部函数中的变量; 一个语言如果支持闭包,那么通常都会具有第2点和第3点的特

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

Lua语言基础汇总(6)-- 迭代器与泛型for

前言 迭代器就是一种可以遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数.每调用一次函数,就返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之后保存一些状态,这样才能知道它所在的位置及如何走到下一个位置,通过之前博文的总结,闭包对于这样的任务提供了极佳的支持.现在我们就用代码来实现一个简单的迭代器. 1 2 3 4 5 6 7 8 9 10 11 12 function values(tb)      local i = 0      return function (

[转]Lua语言基础汇总(6)-- 迭代器与泛型for

前言 迭代器就是一种可以遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数.每调用一次函数,就返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之后保存一些状态,这样才能知道它所在的位置及如何走到下一个位置,通过之前博文的总结,闭包对于这样的任务提供了极佳的支持.现在我们就用代码来实现一个简单的迭代器. 1 2 3 4 5 6 7 8 9 10 11 12 function values(tb)      local i = 0      return function (

Lua语法基础(3)--迭代器和泛型for

迭代器和闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含两个

Lua中的语句

[赋值] 赋值的基本含义是修改一个变量或一个table中字段的值,这个和其它语言没有多少区别,但是对于Lua,有一个特性,它允许"多重赋值",也就是一下子将多个值赋予多个变量,例如以下代码: local x1, x2 = 2, 4 print(x1) -->2 print(x2) -->4 在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值,例如以下用法,可以非常简便的交换两个元素的值: local x1, x2 = 2, 4 x1, x2 = x2, x1 p