Lua中的迭代器和泛型for介绍

编程入门 行业动态 更新时间:2024-10-18 08:20:11

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

例如,我们可以写过简单的list迭代器,让他仅仅返回值。复制代码 代码如下:function values( t ) local i = 0; return function() i = i + 1;return t[i] endend

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处理闭包的速度更快些。还有更强大更复杂的方式是使用协同来创建迭代器。

  • 0
  • 0
  • 0
  • 0
  • 0

更多推荐

Lua中的迭代器和泛型for介绍

本文发布于:2023-06-11 03:51:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/626173.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:迭代   Lua

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!