【问题标题】:Trying to understand Custom Iterators试图理解自定义迭代器
【发布时间】:2019-03-07 00:58:45
【问题描述】:

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

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

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

【问题讨论】:

标签: lua


【解决方案1】:

来自Lua Reference Manual 3.3.5

类似的for语句

 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 是循环的局部变量;你不能使用他们的价值观 在 for 结束之后。如果您需要这些值,请将它们分配给 中断或退出循环之前的其他变量。

所以 squares() 必须返回一个函数 (square) 一个状态 (iteratorMaxCount) 和一个初始值 (0) 才能使用通用的 for 循环。

阅读参考手册,用 Lua 编程。

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 2015-02-04
    • 2013-02-17
    • 2015-11-19
    • 2013-09-02
    • 2016-06-18
    • 2016-04-05
    • 2019-04-01
    相关资源
    最近更新 更多