Lua Iterators:交换参数的位置导致无限循环

时间:2016-06-27 06:31:43

标签: loops for-loop lua lua-table

如果我将function iter2(max,key)中的参数位置交换为iter2(key,max)并将其调用为iter,1,8,则会导致无限循环。

function iter2(max,key)
   if key == nil then
      return 2 , "value:" .. 2
   end
   if key >= max then
      return nil
   else 
      return key+2, "value:" .. key+2
   end

end

for k,v in iter2,8,1 do
   print(k,v)
end

这种行为背后的原因是什么?

1 个答案:

答案 0 :(得分:1)

来自for for <var-list> in <exp-list> do <body> end 的行为 - 声明:

for
     

for做的第一件事是评估之后的表达式   in。这些表达式应该导致三个值保持不变   for迭代器函数不变状态,以及   控制变量的初始值 。 [...]

     

在此初始化步骤之后,for调用迭代器函数   有两个参数:不变状态和控制变量。   (注意,对于for结构,不变状态没有   意思是什么。它只从初始化步骤中获取此值   并在调用迭代器函数时传递它。)然后nil   将迭代器函数返回的值赋给变量   由变量列表声明。如果返回第一个值(一个   分配给控制变量)是for,循环终止。   否则,IPC执行其主体并调用迭代   再次运作,重复这个过程。

因此,当您在函数定义中切换变量时,实际上是使用控制变量的值作为不变状态