LuaIterators(迭代器)

/ / LuaIterators(迭代器)

迭代器是一种构造,使您可以遍历所谓的集合或集合的元素。在Lua中,这些集合通常引用表,这些表用于创建各种数据结构(如数组)。

通用迭代器

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

array={"Lua", "Tutorial"}

for key,value in ipairs(array) 
do
   print(key, value)
end

当无涯教程运行上面的代码时,将获得以下输出-

无涯教程网

1  Lua
2  Tutorial

上面的示例使用了Lua提供的默认 ipairs 迭代器函数。

在Lua中,使用函数来表示迭代器。基于这些迭代器函数的状态维护,有两种主要类型-

  • 无状态迭代器
  • 有状态迭代器

无状态迭代器

通过名称本身,可以理解这种类型的迭代器函数不保留任何状态。

链接:https://www.learnfk.comhttps://www.learnfk.com/lua/lua-iterators.html

来源:LearnFk无涯教程网

现在让无涯教程看一个使用简单的函数创建自己的迭代器的示例,该函数打印 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每次调用函数时通过增加索引来返回集合中的每个元素。

祝学习愉快! (发现内容有误?请选中要编辑的内容 -> 右键 -> 修改 -> 提交!帮助我们改进教程质量)

精选教程推荐

👇 以下精选教程可能对您有帮助,拓展您的技术视野

手把手带你写一个 MiniTomcat -〔郭屹〕

运维监控系统实战笔记 -〔秦晓辉〕

人人都用得上的写作课 -〔涵柏〕

Linux内核技术实战课 -〔邵亚方〕

分布式数据库30讲 -〔王磊〕

Vim 实用技巧必知必会 -〔吴咏炜〕

小马哥讲Spring核心编程思想 -〔小马哥〕

JavaScript核心原理解析 -〔周爱民〕

数据分析实战45讲 -〔陈旸〕

📝 好记忆不如烂笔头,留下您的学习笔记吧!

暂无学习笔记,成为第一个分享的人吧!

您的笔记将帮助成千上万的学习者