了解 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中国 荣誉推出

相关内容

LuatOS出发点,让业余...
2026-01-20 22:22:27
英伟达GeForce No...
IT之家援引博文介绍,Linux 用户此前如果想要运行 GeFor...
2026-01-07 11:16:38
2025年末AI总结:国民...
编者按: 本文为转载,网易有道CEO周枫提到,2025年是AI从早...
2026-01-04 09:46:20
扎克伯格旗下Meta Pl...
扎克伯格旗下Meta Platforms将从2026年开始按AI影...
2025-11-15 07:46:13
微信 Windows/ma...
IT之家 10 月 21 日消息,微信团队刚刚发布了最新的微信 4...
2025-10-21 19:44:56
Infor推出行业专用AI...
Infor公司推出了专门针对行业的人工智能智能体套件,称通用AI工...
2025-10-10 21:44:46

热门资讯

如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Textual:为 Pytho... 快速入门使用 TextualPython 在 Linux 上有像 TkInter 这样的优秀 GUI...
硬核观察 #1245 Open... #1 OpenAI 悄然删除禁止将 ChatGPT 用于 “军事和战争” 的禁令在 1 月 10 日...
使用时间序列数据,用开源工具助... InfluxData 是一个开源的时间序列数据库平台。下面介绍了它是如何被用于边缘应用案例的。收集到...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
硬核观察 #1249 LG 洗... #1 LG 洗衣机每天上传近 4GB 的数据?一个名为 Johnie 的 LG 洗衣机用户发现,他的...
2024 年 Linux 和开... 让我们尝试预测未来吧!新的一年快乐,朋友们 ✨2024 年的钟声已经敲过,我们有必要去预见一下将塑造...