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

时间:2019-11-05 15:01:33

标签: lua

我在玩以下代码,感到困惑。

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”之间放置了空格,效果很好。

1 个答案:

答案 0 :(得分:1)

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

引用Reference Manual

  

一个类似的声明

 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仅被评估一次。其结果是一个迭代器函数,一个状态以及第一个迭代器变量的初始值。
  •   f,s和var是不可见变量。名称仅在此处用于解释目的。   

原始文本中的注释很少,但是我们现在可以跳过它们。有关所有注释的完整版本,请参见Reference Manual

让我们首先考虑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函数接受两个参数:一个表和一个键,然后返回表的下一个成员的键和值。这意味着上面的示例也等同于先前的示例。

最后,for k,v in <HERE> do最多有三件事:

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

pairsipairsgmatch之类的函数只是返回一些预期的东西,如上面的pairs示例所示。

在您的情况下,迭代器square3初始值是{{1 }}。这意味着0的值将按以下方式分配:i, ni, n = square(3, i or 0)在第一次迭代中,然后是上一次迭代中的0的值)。

在Lua中编程也有一章很不错:PIL - 4.3.5 - Generic for。我强烈建议您阅读。实际上,我强烈建议您阅读整个PIL,因为这是在Lua中编程的一个很好的起点。