教程 > lua 教程 > 阅读:107

lua 迭代器(iterator)——迹忆客-ag捕鱼王app官网

迭代器是一种构造对象,它能够遍历所谓的集合或容器的元素。 在 lua 中,这些集合通常指的是表,这些表用于创建各种数据结构,如数组。

泛型 for 迭代器

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

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 内部还有另一个方法,该方法使用局部外部变量 indexcount 通过每次调用函数时递增索引来返回集合中的每个元素。

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

查看笔记

扫码一下
查看教程更方便
网站地图