Lua 中 for...in 的含义是什么?

我正在研究下面的代码,感到很困惑。

function square(iteratorMaxCount,currentNumber)
   if currentNumber<iteratorMaxCount
   then
      currentNumber = currentNumber+1
      return currentNumber, currentNumber*currentNumber
   end

end

for i,n in square,3,0
do
   print(i,n)
end

我不明白 for i,n in square,3,0 到底是什么意思?我在终端中尝试过这个代码,得到了以下错误。

stdin:2: attempt to compare number with nil
stack traceback:
    stdin:2: in function 'for iterator'
    stdin:1: in main chunk
    [C]: in ?

希望可以得到任何相关的评论。

编辑: 我尝试了一次,这次我在“for i,n in square,3,0”中加入了空格,结果运行良好。

点赞
用户4567755
用户4567755

这是Lua的通用 for 循环的语法。

引用自参考手册:

类似于下面的for语句

for var_1, ···, var_n in explist do block end

相当于以下代码:

do
  local f, s, var = explist
  while true do
    local var_1, ···, var_n = f(s, var)
    if var_1 == nil then break end
    var = var_1
    block
  end
end

注意以下几点:

  • explist 仅计算一次,其结果是一个迭代器函数、一个状态和第一个迭代变量的初始值。
  • fsvar 是不可见变量。这里的变量名仅用于说明目的。

原始文本中有更多的注释,但现在我们可以跳过它们。有关所有注释的完整版本,请参阅参考手册

首先让我们考虑 pairs 的基本用法:

for k, v in pairs({5, 6, 7}) do
   print(k, v)
end

调用 pairs 返回一个迭代器和一个状态以供通用的循环使用。第三个值会自动赋值为 nil。我们可以在代码中添加更多描述性,将上面的示例更改为:

local f, s, var = pairs({5, 6, 7})
for k, v in f, s, var do
   print(k, v)
end

请注意,这两个示例的行为方式相同。我们可以提高我们的游戏并彻底摆脱 pairs

for k, v in next, {5, 6, 7}, nil do
   print(k, v)
end

next 函数需要两个参数:一个表和一个键(key),然后返回表的下一个成员的键和值。这意味着上面的示例也相当于以前的示例。

最终,有最多三个东西预期为 for k,v in <HERE> do

  • 一个迭代器- 在每次迭代时调用的函数,用于分配在 for <HERE> in 中声明的变量的值,
  • 一个状态- 在每次迭代中传递给迭代器的值,
  • 一个初始值- 在循环的第一次迭代中作为第二个参数传递给迭代器的值。

pairsipairsgmatch 这样的函数只是简单地按照 pairs 示例中所示返回了某些预期的东西。

在您的案例中,迭代器square状态3初始值0。这意味着 i, n 将被分配以下值:i, n = square(3, i or 0) (0 在第一次迭代时,然后是来自前一次迭代的 i 的值)。

在编写Lua编程方面,PIL - 4.3.5 - Generic for 一章也非常好。我强烈建议您阅读它。实际上,我强烈建议您阅读整个PIL,因为它是进入Lua编程的很好的起点。

2019-11-05 15:22:28