📅  最后修改于: 2020-10-16 05:13:33             🧑  作者: Mango
迭代器是一种构造,使您可以遍历所谓的集合或容器的元素。在Lua中,这些集合通常引用表,这些表用于创建各种数据结构(如数组)。
通用的迭代器提供了集合中每个元素的键值对。下面给出一个简单的例子。
array = {"Lua", "Tutorial"}
for key,value in ipairs(array)
do
print(key, value)
end
当我们运行上面的代码时,我们将获得以下输出-
1 Lua
2 Tutorial
上面的示例使用了Lua提供的默认ipairs迭代器函数。
在Lua中,我们使用函数来表示迭代器。基于这些迭代器功能的状态维护,我们有两种主要类型-
通过名称本身,我们可以理解这种类型的迭代器函数不保留任何状态。
现在,让我们看一个使用打印n个数字的平方的简单函数创建自己的迭代器的示例。
function square(iteratorMaxCount,currentNumber)
if currentNumber
当我们运行上面的程序时,我们将得到以下输出。
1 1
2 4
3 9
可以对上面的代码进行一些修改,以模仿迭代器的ipairs函数的工作方式。如下所示。
function square(iteratorMaxCount,currentNumber)
if currentNumber
当我们运行上面的程序时,我们将得到以下输出。
1 1
2 4
3 9
之前使用函数进行迭代的示例未保留状态。每次调用该函数,它都会根据发送给该函数的第二个变量返回集合的下一个元素。为了保持当前元素的状态,使用了闭包。闭包在函数调用之间保留变量值。为了创建一个新的闭包,我们创建了两个函数,包括闭包本身和一个工厂(创建闭包的函数) 。
现在,让我们看一个创建自己的迭代器的示例,其中将使用闭包。
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每次调用函数时通过增加索引来返回集合中的每个元素。
我们可以使用闭包来创建自己的函数迭代器,如上所示,并且每次迭代集合时,它可以返回多个元素。