- Lua 教程
- Lua - 首页
- Lua 基础
- Lua - 概述
- Lua - 环境
- Lua - 基本语法
- Lua - 注释
- Lua - 打印 Hello World
- Lua - 变量
- Lua - 数据类型
- Lua - 运算符
- Lua - 循环
- Lua - 决策
- Lua - 函数
- Lua - 日期和时间
- Lua 数组
- Lua - 数组
- Lua - 多维数组
- Lua - 数组长度
- Lua - 遍历数组
- Lua 迭代器
- Lua - 迭代器
- Lua 列表
- Lua - 在列表中搜索
- Lua 模块
- Lua - 模块
- Lua - 命名空间
- Lua 元表
- Lua - 元表
- Lua 协程
- Lua - 协程
- Lua 文件处理
- Lua - 文件 I/O
- Lua 库
- Lua - 标准库
- Lua - 数学库
- Lua - 操作系统功能
- Lua 有用资源
- Lua - 快速指南
- Lua - 有用资源
- Lua - 讨论
Lua - 迭代器
迭代器是一种构造,它使您能够遍历所谓的集合或容器中的元素。在 Lua 中,这些集合通常指的是表,表用于创建各种数据结构,如数组。
泛型 For 迭代器
泛型for迭代器提供集合中每个元素的键值对。下面给出一个简单的例子。
main.lua
array = {"Lua", "Tutorial"} for key,value in ipairs(array) do print(key, value) end
输出
当我们运行以上代码时,我们将得到以下输出:
1 Lua 2 Tutorial
以上示例使用 Lua 提供的默认ipairs迭代器函数。
在 Lua 中,我们使用函数来表示迭代器。根据这些迭代器函数中的状态维护,我们主要有两种类型:
- 无状态迭代器
- 有状态迭代器
无状态迭代器
顾名思义,我们可以理解这种类型的迭代器函数不保留任何状态。
现在让我们看看一个创建我们自己的迭代器的例子,它使用一个简单的函数打印n个数字的平方。
main.lua
function square(iteratorMaxCount,currentNumber) if currentNumber<iteratorMaxCount then currentNumber = currentNumber+1 return currentNumber, currentNumber*currentNumber end end for i,n in square,3,0 do print(i,n) end
输出
当我们运行以上程序时,我们将得到以下输出。
1 1 2 4 3 9
以上代码可以稍作修改,以模拟迭代器ipairs函数的工作方式。如下所示。
main.lua
function square(iteratorMaxCount,currentNumber) if currentNumber<iteratorMaxCount then currentNumber = currentNumber+1 return currentNumber, currentNumber*currentNumber end end function squares(iteratorMaxCount) return square,iteratorMaxCount,0 end for i,n in squares(3) do print(i,n) end
输出
当我们运行以上程序时,我们将得到以下输出。
1 1 2 4 3 9
有状态迭代器
前面使用函数进行迭代的示例不保留状态。每次调用函数时,它都会根据发送到函数的第二个变量返回集合的下一个元素。为了保存当前元素的状态,使用了闭包。闭包跨函数调用保留变量值。要创建一个新的闭包,我们创建两个函数,包括闭包本身和工厂,即创建闭包的函数。
现在让我们看看一个创建我们自己的迭代器的例子,在这个例子中我们将使用闭包。
main.lua
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 end end for element in elementIterator(array) do print(element) end
输出
当我们运行以上程序时,我们将得到以下输出。
Lua Tutorial
在上面的例子中,我们可以看到elementIterator在内部还有另一个方法,它使用局部外部变量index和count通过每次调用函数时递增index来返回集合中的每个元素。
我们可以像上面一样使用闭包创建我们自己的函数迭代器,并且它可以为每次遍历集合时返回多个元素。
广告