尝试理解自定义迭代器

我正在尝试理解迭代器,在很多例子中我发现了这样的东西:

function square(iteratorMaxCount,currentNumber)

   if currentNumber<iteratorMaxCount
   then
      currentNumber = currentNumber+1
      return currentNumber, currentNumber*currentNumber
   end

end

function squares(iteratorMaxCount)
   return square,iteratorMaxCount,0 // 为什么不返回 square(iteratorMAxCount,0)????
end

for i,n in squares(3)
do
   print(i,n)
end

首先,我不理解我评论的那一行,我也找不到一个易懂的例子来解释有状态迭代器和无状态迭代器。有人能帮我吗?谢谢

点赞
用户2858170
用户2858170

Lua参考手册3.3.5

像这样的for语句

for var_1,···,var_n in explist do block end

等同于以下代码:

do
    local f,s,var = explist
    while true do
        local var_1,···,var_n = f(s,var)
        if var_1 == nil then break end
        var = var_1
        block
    end
end

注意以下几点:

  • explist 只计算一次。它的结果是一个迭代器函数,一个状态和第一个迭代变量的初始值。
  • f, s 和 var 是不可见的变量。这里的名称仅用于解释。
  • 您可以使用 break 退出 for 循环。
  • 循环变量 var_i 是循环局部的,您不能在 for 结束后使用它们的值。如果需要这些值,可以在 break 或退出循环之前将它们分配给其他变量。

因此, squares()必须返回一个函数( square ),一个状态( iteratorMaxCount )和一个初始值( 0 ),以便与通用的for循环一起使用。

阅读参考手册"Lua程序设计"。

2019-03-06 16:58:45