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

xx

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

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

绿色

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

原始文本中几乎没有其他注释,但是我们现在可以跳过它们。有关所有注释的完整版本,请参见参考手册

让我们考虑一下pairsfirst的基本用法

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
  • 在每次迭代中传递给迭代器状态
  • 一个初始值-值作为第二个参数传递迭代器在循环的第一次迭代。

功能,如pairsipairsgmatch简单地返回一些的那些预期事情中所示pairs上述实施例。

在你的情况下,迭代square状态3初始值0这意味着i, n将具有中被指定为它们的值:i, n = square(3, i or 0)0在第一次迭代,则该值i从以前的迭代)。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章