了解 for 循环结构和你在控制它时拥有的选项,这样你可以对如何在 Lua 中处理数据做出聪明的决定。
在编程中,迭代是一个重要的概念,因为代码通常必须多次扫描一组数据,以便它可以单独处理每个项目。控制结构使你能够根据通常在程序运行时动态建立的条件来指导程序的流程。不同的语言提供不同的控制,在 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.lua1665447960
$ 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.lua1: zombie2: Halloween3: apocalypse
for 循环
for
循环结构在编程中很常见,由于经常使用表和pairs
函数,因此在 Lua 中非常常见。了解for
循环结构和控制它时的选项意味着你可以就如何在 Lua 中处理数据做出明智的决定。