如果我将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
这种行为背后的原因是什么?
答案 0 :(得分:1)
来自for
for <var-list> in <exp-list> do
<body>
end
的行为 - 声明:
for
for
做的第一件事是评估之后的表达式 in。这些表达式应该导致三个值保持不变for
:迭代器函数,不变状态,以及 控制变量的初始值 。 [...]在此初始化步骤之后,
for
调用迭代器函数 有两个参数:不变状态和控制变量。 (注意,对于for
结构,不变状态没有 意思是什么。它只从初始化步骤中获取此值 并在调用迭代器函数时传递它。)然后nil
将迭代器函数返回的值赋给变量 由变量列表声明。如果返回第一个值(一个 分配给控制变量)是for
,循环终止。 否则,IPC
执行其主体并调用迭代 再次运作,重复这个过程。
因此,当您在函数定义中切换变量时,实际上是使用控制变量的值作为不变状态。