试图了解自定义迭代器

时间:2019-03-06 14:18:07

标签: 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 // why not return square(iteratorMAxCount,0)????
end  

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

首先,我不明白我要评论的那行,也没有找到一个简单的示例来说明如何执行有状态迭代器和无状态迭代器。有谁能够帮助我?谢谢

1 个答案:

答案 0 :(得分:2)

来自Lua Reference Manual 3.3.5

  

一个类似的声明

 for var_1, ···, var_n in explist do block end is equivalent to the code:

 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 Note the following:
     

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

因此,squares()必须返回一个函数(square),一个状态(iteratorMaxCount)和一个初始值(0)才能使用泛型for循环。

阅读参考手册,《在Lua中编程》。