Lua 迭代器:交换参数位置导致无限循环

如果我将 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

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

点赞
用户1190388
用户1190388

《Lua 程序设计》一章中提到了 for 循环的行为:

for <var-list> in <exp-list> do
  <body>
end

for 做的第一件事情是计算 in 关键字之后的表达式。这些表达式应该返回 for 保留的三个值:迭代器方法、不变的状态和控制变量的初始值。[...]

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

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

2016-06-27 07:10:20