我在玩以下代码,感到困惑。
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是不可见变量。名称在这里仅用于说明目的。
原始文本中几乎没有其他注释,但是我们现在可以跳过它们。有关所有注释的完整版本,请参见参考手册。
让我们考虑一下pairs
first的基本用法:
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
和初始值是0
。这意味着i, n
将具有中被指定为它们的值:i, n = square(3, i or 0)
(0
在第一次迭代,则该值i
从以前的迭代)。
Lua中的编程也有一章很好:PIL-4.3.5-通用。我强烈建议您阅读。实际上,我强烈建议您阅读整个PIL,因为这是使用Lua编程的一个很好的起点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句