导读 无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。

每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。这种无状态迭代器的典型的简单的例子是 ipairs,它遍历数组的每一个元素。

案例

无状态迭代器的使用

#!/usr/bin/lua
print("haicoder(www.haicoder.net)\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(string.format("i = %d, square = %d", i, n))
end

程序运行,控制台输出,如下图:

我们可以看到,我们使用了函数来实现迭代器,实现了求数字 n 的平方。迭代的状态包括被遍历的表(循环过程中不会改变的状态常量)和当前的索引下标(控制变量),ipairs 和迭代函数都很简单,我们在 Lua 中可以这样实现:

#!/usr/bin/lua
print("haicoder(www.haicoder.net)\n")
function iter (a, i)
    i = i + 1
    local v = a[i]
    if v then
       return i, v
    end
end
function ipairs (a)
    return iter, a, 0
end

当 Lua 调用 ipairs(a) 开始循环时,他获取三个值:迭代函数 iter、状态常量 a、控制变量初始值 0;然后 Lua 调用 iter(a,0) 返回 1, a[1](除非 a[1]=nil);第二次迭代调用 iter(a,1) 返回 2,a[2]…直到第一个 nil 元素。

Lua无状态迭代器总结

无状态的迭代器是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。

每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用,一个无状态的迭代器只利用这两个值可以获取下一个元素。这种无状态迭代器的典型的简单的例子是 ipairs,它遍历数组的每一个元素。

原文来自:https://haicoder.net/lua/lua-stateless-iterator.html

本文地址:https://www.linuxprobe.com/lua-stateless-iterator.html编辑:薛鹏旭,审核员:逄增宝

Linux命令大全:https://www.linuxcool.com/

Linux系统大全:https://www.linuxdown.com/

红帽认证RHCE考试心得:https://www.rhce.net/