了解 Lua 的 for 循环
创始人
2024-03-02 13:32:00
0

了解 for 循环结构和你在控制它时拥有的选项,这样你可以对如何在 Lua 中处理数据做出聪明的决定。

在编程中,迭代是一个重要的概念,因为代码通常必须多次扫描一组数据,以便它可以单独处理每个项目。控制结构使你能够根据通常在程序运行时动态建立的条件来指导程序的流程。不同的语言提供不同的控制,在 Lua 中,有 while 循环、for 循环和 repeat until 循环。本文介绍 for 循环。我将在另一篇文章中介绍 whilerepeat 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 这个词不是关键字。为了清楚起见,这正是我在示例代码中使用的内容。程序员通常使用更短的名称,例如 ic

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 循环之一。这个使用 pairsipairs 函数来迭代一个表:

mytable = { "zombie", "Halloween", "apocalypse" }
for i,v in ipairs(mytable) do
  print(i .. ": " v)
end

pairsipairs 函数“解包”表并将值转储到你提供的变量中。在此示例中,我将 i 用于 索引,将 v 用于 ,但变量名称无关紧要。

$ lua ./for.lua1: zombie2: Halloween3: apocalypse

for 循环

for 循环结构在编程中很常见,由于经常使用表和 pairs 函数,因此在 Lua 中非常常见。了解 for 循环结构和控制它时的选项意味着你可以就如何在 Lua 中处理数据做出明智的决定。


via: https://opensource.com/article/22/11/lua-for-loops

作者:Seth Kenlon 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

据AXIOS网站:Meta...
据AXIOS网站:Meta Platforms(META.O)将发...
2026-04-07 11:46:36
前Allen Instit...
AIPress.com.cn报道 3月24日消息,微软宣布聘任前A...
2026-03-24 20:36:05
AI正撬动科学研究的革新
话题主持 本报记者 易蓉 实验室里,机器人的机械臂灵巧操作,实验数...
2026-03-19 13:24:38
美团Tabbit 浏览器回...
3月3日消息,美团旗下光年之外团队近日因新发布的Tabbit AI...
2026-03-03 15:50:15
晶泰科技与晶科能源合作模式...
据业内消息,上周,马斯克团队对中国光伏产业链进行了调研,对象包括T...
2026-02-04 16:18:47
回馈开源社区,利欧数字发布...
今天,利欧数字正式发布 Doubao Seedream Plugi...
2026-01-29 15:20:29

热门资讯

PHP最佳实践(译) 简介PHP是一门复杂的语言,经过多年折腾,使其不同版本之间高度不一致,有时还有些bug。 每个版本都...
值得收藏的 27 个机器学习的... 机器学习 ( Machine Learning ) 有很多方面,当我开始研究学习它时,我发现了各种各...
为什么计量 IT 的生产力如此... 在某些行业里,人们可以根据一些测量标准判定一个人的生产力。比如,如果你是一个零件制造商,可以通过一个...
8个有趣的Linux提示与技巧... 我们时不时给你带来关于Linux的提示与技巧。和这个系列保持一致,这里有8个我们从读者收到最有趣的提...
8 个提升你的隐私防护的开源密... 使用一些顶级开源密码管理器,确保你的登录凭证安全无虞。密码管理器是一项非常有用的实用程序。在你想寻找...
硬核观察 #885 苹果 AR... 苹果 AR 眼镜被无限期推迟据报道,由于技术上的挑战,苹果公司已经无限期推迟了其轻型增强现实(AR)...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
2020 年的 GitHub ... 距离 2020 年结束只剩下区区 24 天,我们即将结束魔幻的 2020 ,迎来新的一年,新的一年或...
开源新闻速递:openSUSE... 今日关注openSUSE 项目组的 Dominique Leuenberger 在他的周报中说:“这...
KDE4.11 Beta1 正...   KDE 项目工作组刚刚发布了 KDE Software Compilation 4.11 Bet...