改变变量顺序后"for"循环突然无限



我刚刚认识到,返回变量的顺序确实会影响";对于";循环工作,这是一件非常有趣的事情

local function FakeIpairs(t) --The factory
local i = i or 0 --The control variable

local function Iterator() --The iterator function
i = i + 1 --Increment the control variable 
v = t[i]
return v, i
end 

return Iterator
end 
arr = {1, 9, 8, [5] = 10} 
for v, i in FakeIpairs(arr) do 
print(v)
end 
--[[ 1
9
8 --]]

我更改了变量的顺序,这种情况发生在

local function FakeIpairs(t) --The factory
local i = i or 0 --The control variable

local function Iterator() --The iterator function
i = i + 1 --Increment the control variable 
v = t[i]
return i, v --[[CHANGED HERE]]
end 

return Iterator
end 
arr = {1, 9, 8, [5] = 10} 
for i, v --[[AND HERE]] in FakeIpairs(arr) do 
print(i)
end 
--[[ 1
9
8
nil
10
nil
nil
nil...--]]

它立即变成了一个无限循环,没有任何条件语句(我在函数中放入了一个条件语句,它运行得很好(。

for循环和返回变量的顺序之间有什么关系?如果我把v, i改成i, v,为什么代码会永远保持return v, i并递增i

这在参考手册中有解释。循环的通用

这些变量中的第一个是控制变量。

及以后的

如果控制变量变为nil,则循环终止。否则,执行主体,循环进入下一次迭代。

在第二个示例中,第一个变量是索引(控制变量(。索引在每次迭代时递增,并且永远不会变为零。当控制变量永远不会变为零时,循环就永远不会停止。

最新更新