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来返回集合中的每个元素。

我们可以像上面一样使用闭包创建我们自己的函数迭代器,并且它可以为每次遍历集合时返回多个元素。

广告