我刚刚认识到,返回变量的顺序确实会影响";对于";循环工作,这是一件非常有趣的事情
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,则循环终止。否则,执行主体,循环进入下一次迭代。
在第二个示例中,第一个变量是索引(控制变量(。索引在每次迭代时递增,并且永远不会变为零。当控制变量永远不会变为零时,循环就永远不会停止。