开发手册 欢迎您!
软件开发者资料库

Lua - 迭代器

Lua Iterators - 从基本到高级概念的简单简单步骤学习Lua编程语言,其中包括概述,环境设置,基本语法,变量,数据类型,运算符,循环,决策,函数,字符串,数组,迭代器,表,模块,Metatables,协同程序,文件I / O,错误处理,调试,垃圾收集,面向对象,Web编程,数据库访问,游戏编程及其标准库。

Iterator是一个构造,它允许您遍历所谓的集合或容器的元素.在Lua中,这些集合通常引用表,这些表用于创建各种数据结构,如数组.

Generic for Iterator

泛型 for iterator提供集合中每个元素的键值对.下面给出一个简单的例子.

array = {"Lua", "Tutorial"}for key,value in ipairs(array) do   print(key, value)end

当我们运行上面的代码时,我们将获得以下输出 :

1  Lua2  Tutorial

以上示例使用Lua提供的默认 ipairs 迭代器函数.

在Lua中我们使用用于表示迭代器的函数.根据这些迭代器函数中的状态维护,我们有两个主要类型 :

  • 无状态迭代器

  • 有状态迭代器

无状态迭代器

通过名称本身我们可以理解这种类型的迭代器函数不保留任何状态.

现在让我们看一个使用打印 n 数字的方块的简单函数创建自己的迭代器的示例.

function square(iteratorMaxCount,currentNumber)   if currentNumber

当我们运行上述程序时,我们将得到以下输出.

112439

上面的代码可以稍微修改,以模仿迭代器的 ipairs 函数的工作方式.如下所示.

function square(iteratorMaxCount,currentNumber)   if currentNumber

当我们运行上述程序时,我们将获得以下输出.

112439

有状态迭代器

前一个使用函数的迭代示例不保留状态.每次调用该函数时,它都会根据发送给函数的第二个变量返回集合的下一个元素.为了保持当前元素的状态,使用闭包. Closure在函数调用中保留变量值.为了创建一个新的闭包,我们创建了两个函数,包括闭包本身和一个工厂,即创建闭包的函数.

现在让我们看一个创建我们自己的迭代器的例子,我们在其中将使用闭包.

array = {"Lua", "Tutorial"}function elementIterator (collection)   local index = 0   local count = #collection   -- The closure function is returned   return function ()      index = index + 1      if index <= count      then         -- return the current element of the iterator         return collection[index]      end   endendfor element in elementIterator(array)do   print(element)end

W如果我们运行上面的程序,我们将得到以下输出.

LuaTutorial

在上面的例子中,我们可以看到elementIterator里面有另一个方法,它使用局部外部变量index和count来返回集合中的每个元素,方法是每次函数都是递增索引.调用.

我们可以使用闭包创建我们自己的函数迭代器,如上所示,它可以为迭代整个集合的每一个返回多个元素.