在编程中,迭代是一个重要的概念,因为代码经常需要多次扫描一组数据,以便它可以单独处理每个项目。控制结构使您能够根据程序运行时动态建立的条件来指导程序的流程。不同的语言提供不同的控制,在 Lua 中,有 while 循环、for 循环和 repeat until 循环。本文介绍 for 循环。我将在另一篇文章中介绍 while 和 repeat until 循环。
For 循环
for 循环接受已知数量的项目,并确保每个项目都得到处理。“项目”可以是数字。它也可以是包含多个条目的表或任何 Lua 数据类型。语法和逻辑有点灵活,但语法允许使用这些参数,每个参数本质上都描述一个计数器
- 计数器的起始值
- 停止值
- 您希望计数器前进的增量
例如,假设您有三个项目,并且希望 Lua 处理每个项目。您的计数器可以从 3 开始,一直持续到 1,增量为 -1。这将呈现 3、2、1 的计数。
mytable = { "zombie", "Halloween", "apocalypse" }
for count = 3, 1, -1 do
print(count .. ": " .. mytable[count])
end
运行代码以确保所有三个项目都得到处理
$ lua ./for.lua
3: apocalypse
2: Halloween
1: zombie
此代码有效地“反向”处理了表,因为它是一个倒计时。您可以改为向上计数
for count = 1, 3, 1 do
print(mytable[count])
end
此示例从最低索引到最高索引处理表
$ lua ./for.lua
1: zombie
2: Halloween
3: apocalypse
增量
您也可以更改增量。例如,也许您想要一个没有万圣节所有盛况的僵尸末日
mytable = { "zombie", "Halloween", "apocalypse" }
for count = 1, 3, 2 do
print(mytable[count])
end
运行代码
$ lua ./for.lua
zombie
apocalypse
该示例打印了 1 和 3,因为第一个计数为 1,然后递增 2(总共为 3)。
计数器
有时您不知道需要 Lua 迭代数据的次数。在这种情况下,您可以将计数器设置为由其他进程填充的变量。
此外,单词 count
不是关键字。这只是我在示例代码中为清晰起见使用的名称。程序员通常使用较短的名称,例如 i
或 c
。
var = os.time()
if var%2 == 0 then
mytable = { var }
else
mytable = { "foo", "bar", "baz" }
end
for c = 1, #mytable, 1 do
print(mytable[c])
end
此代码创建一个变量,其中包含启动时的时间戳。如果时间戳是偶数(除以 2 时模数为 0),则仅将时间戳放入表中。如果时间戳是奇数,则将三个字符串放入表中。
现在您无法确定 for 循环需要运行多少次。它要么运行一次,要么运行三次,但无法确定。解决方案是将起始计数设置为 1,并将最终计数设置为表的长度(#mytable
是确定表长度的内置快捷方式)。
可能需要运行几次脚本才能看到这两个结果,但最终,您会得到类似这样的结果
$ lua ./dynamic.lua
1665447960
$ lua ./dynamic.lua
foo
bar
baz
带有 pairs 和 ipairs 的 For 循环
如果您已经阅读过我关于 表迭代 的文章,那么您已经熟悉 Lua 中最常见的 for 循环之一。这个循环使用 pairs
或 ipairs
函数来迭代表
mytable = { "zombie", "Halloween", "apocalypse" }
for i,v in ipairs(mytable) do
print(i .. ": " v)
end
pairs
和 ipairs
函数“解包”表并将值转储到您提供的变量中。在本例中,我使用 i
表示索引,v
表示值,但变量的名称无关紧要。
$ lua ./for.lua
1: zombie
2: Halloween
3: apocalypse
For 循环
for 循环结构在编程中很常见,在 Lua 中非常常见,因为它经常使用表和 pairs
函数。理解 for 循环结构以及控制它的选项意味着您可以就如何在 Lua 中处理数据做出明智的决策。
评论已关闭。