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

(编辑:jimmy 日期: 2024/12/24 浏览:2)

任何一种结构,只要允许你遍历集合中所有元素的都可称之为迭代器。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处理闭包的速度更快些。还有更强大更复杂的方式是使用协同来创建迭代器。

一句话新闻

一文看懂荣耀MagicBook Pro 16
荣耀猎人回归!七大亮点看懂不只是轻薄本,更是游戏本的MagicBook Pro 16.
人们对于笔记本电脑有一个固有印象:要么轻薄但性能一般,要么性能强劲但笨重臃肿。然而,今年荣耀新推出的MagicBook Pro 16刷新了人们的认知——发布会上,荣耀宣布猎人游戏本正式回归,称其继承了荣耀 HUNTER 基因,并自信地为其打出“轻薄本,更是游戏本”的口号。
众所周知,寻求轻薄本的用户普遍更看重便携性、外观造型、静谧性和打字办公等用机体验,而寻求游戏本的用户则普遍更看重硬件配置、性能释放等硬核指标。把两个看似难以相干的产品融合到一起,我们不禁对它产生了强烈的好奇:作为代表荣耀猎人游戏本的跨界新物种,它究竟做了哪些平衡以兼顾不同人群的各类需求呢?