我在玩以下代码,感到困惑。
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”之间放置了空格,效果很好。
答案 0 :(得分:1)
这是Lua的通用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是不可见变量。名称仅在此处用于解释目的。
原始文本中的注释很少,但是我们现在可以跳过它们。有关所有注释的完整版本,请参见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
中声明的变量,如pairs
,ipairs
或gmatch
之类的函数只是返回一些预期的东西,如上面的pairs
示例所示。
在您的情况下,迭代器是square
,州是3
,初始值是{{1 }}。这意味着0
的值将按以下方式分配:i, n
(i, n = square(3, i or 0)
在第一次迭代中,然后是上一次迭代中的0
的值)。
在Lua中编程也有一章很不错:PIL - 4.3.5 - Generic for。我强烈建议您阅读。实际上,我强烈建议您阅读整个PIL,因为这是在Lua中编程的一个很好的起点。