博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lua自定义迭代器
阅读量:6860 次
发布时间:2019-06-26

本文共 2674 字,大约阅读时间需要 8 分钟。

迭代器

http://www.tutorialspoint.com/lua/lua_iterators.htm

迭代器能够让你遍历某个集合或者容器中的每一个元素。 对于lua来说, 集合通常指代 table, 用于创建变化的数据结构, 类似数组。

Iterator is a construct that enables you to traverse through the elements of the so called collection or container. In Lua, these collections often refer to tables, which are used to create various data structures like array.

 

通用For迭代器

 

通常使用的for循环, 配合in使用, in后的参数 就是一个迭代器函数。

A generic for iterator provides the key value pairs of each element in the collection. A simple example is given below.

array = {
"Lua", "Tutorial"} for key,value in ipairs(array) do print(key, value) end

对于迭代器函数, 根据迭代器函数中状态的维护, 可以分为如下两种类型, 有状态迭代器, 和 无状态迭代器。

In Lua we use functions to represent iterators. Based on the state maintenance in these iterator functions, we have two main types −

  • Stateless Iterators
  • Stateful Iterators

 

无状态迭代器

迭代器函数中不维护任何状态。

By the name itself we can understand that this type of iterator function does not retain any state.

Let us now see an example of creating our own iterator using a simple function that prints the squares of n numbers.

如下例子, 迭代状态, 由for的参数 i 记录。

function square(iteratorMaxCount,currentNumber) if currentNumber

 

改进版:

function square(iteratorMaxCount,currentNumber) if currentNumber

 

有状态迭代器

利用闭包,将状态管理在闭包类, 迭代器函数为闭包。

The previous example of iteration using function does not retain the state. Each time the function is called, it returns the next element of the collection based on a second variable sent to the function. To hold the state of the current element, closures are used. Closure retain variables values across functions calls. To create a new closure, we create two functions including the closure itself and a factory, the function that creates the closure.

Let us now see an example of creating our own iterator in which we will be using closures.

 

如下例子,推荐使用如下写法,减少信息暴漏:

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

 

自定义例子

使用有状态迭代器, 实现字符串拆分为固定长度的字符串:

 

local instr = "2334t545dfgjkkkk"function StrSegIterator (str, segSize) local strIndex = 1 -- The closure function is returned return function ()  local segStart = strIndex  local segEnd = strIndex + segSize - 1  local strseg = string.sub(str, segStart, segEnd)  if #strseg > 0 then   strIndex = strIndex + segSize   -- return the current element of the iterator   return strseg  end endendfor element in StrSegIterator(instr, 2)do   print(element)end

 

转载地址:http://pdxyl.baihongyu.com/

你可能感兴趣的文章
Reverse String
查看>>
linux安装ffmpeg
查看>>
第三期 轨迹生成——2.运动规划问题
查看>>
PHP 从数组对象中取出数组提示:Undefined property: stdClass::$subject
查看>>
存储过程
查看>>
ext组件中的查询
查看>>
Python笔记总结week1
查看>>
c#中使用NetCDF存储二维数据的读写操作简单应用
查看>>
linux网络相关命令使用
查看>>
java基础(二)
查看>>
cocos2d中的anchorPoint
查看>>
记录一下:chrome上,把网页保存为文件的插件
查看>>
C#和Javascript间互转的Xxtea加解密
查看>>
BAT批处理中的字符串处理详解(字符串截取)
查看>>
智力题集锦【二】
查看>>
读 《我为什么放弃Go语言》 有感
查看>>
删除MySQL中冗余字段
查看>>
linux基础—课堂随笔_03 SHELL脚本编程基础
查看>>
【Win7快捷键启动程序有哪些妙招】
查看>>
MS DOS 命令大全
查看>>