修改变量顺序后,“for”循环突然变成无限循环

我刚刚意识到返回变量的顺序会影响“for”循环的工作方式,这是一个非常有趣的事情。

local function FakeIpairs(t) --工厂
  local i = i or 0 --控制变量

  local function Iterator() --迭代器函数
    i = i + 1 --增加控制变量
    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) --工厂
  local i = i or 0 --控制变量

  local function Iterator() --迭代器函数
    i = i + 1 --增加控制变量
    v = t[i]
      return i, v --[[修改了这里]]
  end

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

它立即变成了无限循环,没有任何条件语句(我将条件语句放入函数中,它可以正常工作)。

“for”循环与返回变量的顺序之间有什么关系?为什么如果我将“v,i”更改为“i,v”,代码会保持“return v,i”并无限增加“i”?

点赞
用户1741542
用户1741542

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

其中第一个变量是控制变量。

稍后又说到

如果控制变量变成 nil,则循环终止。否则,执行体被执行并且循环跳到下一次迭代。

在第二个例子中,第一个变量是索引 (控制变量)。索引在每次迭代时递增,且从不变成 nil。当控制变量永远不会变成 nil 时,循环永不停止。

2020-08-31 14:22:53