上一节:
下一节:

  Lua - 迭代器

  • 简述

    迭代器是一种构造,它使您能够遍历所谓的集合或容器的元素。在 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<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函数的工作方式。它如下所示。
    
    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
    
  • 有状态迭代器

    前面使用函数进行迭代的示例不保留状态。每次调用该函数时,它都会根据发送给该函数的第二个变量返回集合的下一个元素。为了保持当前元素的状态,使用了闭包。闭包保留跨函数调用的变量值。为了创建一个新的闭包,我们创建了两个函数,包括闭包本身和一个工厂,即创建闭包的函数。
    现在让我们看一个创建我们自己的迭代器的例子,我们将在其中使用闭包。
    
    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 通过每次调用函数时递增索引来返回集合中的每个元素。
    我们可以使用闭包创建我们自己的函数迭代器,如上所示,它可以为我们每次迭代集合时返回多个元素。
上一节:
下一节: