2022-12-02 09:40:48 +08:00
|
|
|
|
[#]: subject: "Get to know Lua for loops in 4 minutes"
|
|
|
|
|
[#]: via: "https://opensource.com/article/22/11/lua-for-loops"
|
|
|
|
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
|
|
|
|
[#]: collector: "lkxed"
|
|
|
|
|
[#]: translator: "geekpi"
|
2022-12-08 09:46:53 +08:00
|
|
|
|
[#]: reviewer: "wxy"
|
|
|
|
|
[#]: publisher: "wxy"
|
|
|
|
|
[#]: url: "https://linux.cn/article-15328-1.html"
|
2022-12-02 09:40:48 +08:00
|
|
|
|
|
2022-12-08 09:46:53 +08:00
|
|
|
|
了解 Lua 的 for 循环
|
2022-12-02 09:40:48 +08:00
|
|
|
|
======
|
|
|
|
|
|
2022-12-08 09:46:53 +08:00
|
|
|
|
![][0]
|
2022-12-02 09:40:48 +08:00
|
|
|
|
|
2022-12-08 09:46:53 +08:00
|
|
|
|
> 了解 for 循环结构和你在控制它时拥有的选项,这样你可以对如何在 Lua 中处理数据做出聪明的决定。
|
2022-12-02 09:40:48 +08:00
|
|
|
|
|
2022-12-08 09:46:53 +08:00
|
|
|
|
在编程中,迭代是一个重要的概念,因为代码通常必须多次扫描一组数据,以便它可以单独处理每个项目。控制结构使你能够根据通常在程序运行时动态建立的条件来指导程序的流程。不同的语言提供不同的控制,在 [Lua][1] 中,有 `while` 循环、`for` 循环和 `repeat until` 循环。本文介绍 `for` 循环。我将在另一篇文章中介绍 `while` 和 `repeat until` 循环。
|
|
|
|
|
|
|
|
|
|
### for 循环
|
|
|
|
|
|
|
|
|
|
`for` 循环接受已知数量的项目并确保处理每个项目。“项目”可以是数字,它也可以是一个包含多个条目或任何 Lua 数据类型的表。语法和逻辑有点灵活,但语法允许这些参数,每个参数本质上描述了一个计数器:
|
2022-12-02 09:40:48 +08:00
|
|
|
|
|
|
|
|
|
- 计数器的起始值
|
|
|
|
|
- 停止值
|
|
|
|
|
- 你希望计数器前进的增量
|
|
|
|
|
|
|
|
|
|
例如,假设你有三个项目并希望 Lua 处理每个项目。你的计数器可以从 3 开始一直持续到 1,增量为 -1。这呈现为 3、2、1 的计数。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
mytable = { "zombie", "Halloween", "apocalypse" }
|
|
|
|
|
for count = 3, 1, -1 do
|
|
|
|
|
print(count .. ": " .. mytable[count])
|
|
|
|
|
end
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
运行代码以确保所有三个项目都得到处理:
|
|
|
|
|
|
|
|
|
|
```
|
2022-12-08 09:46:53 +08:00
|
|
|
|
$ lua ./for.lua
|
|
|
|
|
3: apocalypse
|
|
|
|
|
2: Halloween
|
|
|
|
|
1: zombie
|
2022-12-02 09:40:48 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这段代码有效地“反向”处理了表,因为它是倒数。你可以正数:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
for count = 1, 3, 1 do
|
|
|
|
|
print(mytable[count])
|
|
|
|
|
end
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
此示例从最低索引到最高索引处理表:
|
|
|
|
|
|
|
|
|
|
```
|
2022-12-08 09:46:53 +08:00
|
|
|
|
$ lua ./for.lua
|
|
|
|
|
1: zombie
|
|
|
|
|
2: Halloween
|
|
|
|
|
3: apocalypse
|
2022-12-02 09:40:48 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 增量
|
|
|
|
|
|
|
|
|
|
你也可以更改增量。例如,也许你想要一个没有万圣节盛况的僵尸启示录:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
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),则只将时间戳放入表中。如果时间戳是奇数,它将三个字符串放入一个表中。
|
|
|
|
|
|
2022-12-08 09:46:53 +08:00
|
|
|
|
现在你无法确定你的 `for` 循环需要运行多少次。可能是一次或是三次,但没有办法确定。解决方案是将起始计数设置为 1,将最终计数设置为表的长度(`#mytable` 是确定表长度的内置快捷方式)。
|
2022-12-02 09:40:48 +08:00
|
|
|
|
|
|
|
|
|
可能需要多次运行脚本才能看到这两个结果,但最终,你会得到如下结果:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ lua ./dynamic.lua1665447960
|
|
|
|
|
$ lua ./dynamic.lua
|
|
|
|
|
foo
|
|
|
|
|
bar
|
|
|
|
|
baz
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 带 pairs 和 ipairs 的 for 循环
|
|
|
|
|
|
2022-12-08 09:46:53 +08:00
|
|
|
|
如果你已经阅读了我关于 [表迭代][2] 的文章,那么你已经熟悉了 Lua 中最常见的 `for` 循环之一。这个使用 `pairs` 或 `ipairs` 函数来迭代一个表:
|
2022-12-02 09:40:48 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
mytable = { "zombie", "Halloween", "apocalypse" }
|
|
|
|
|
for i,v in ipairs(mytable) do
|
|
|
|
|
print(i .. ": " v)
|
|
|
|
|
end
|
|
|
|
|
```
|
|
|
|
|
|
2022-12-08 09:46:53 +08:00
|
|
|
|
`pairs` 和 `ipairs` 函数“解包”表并将值转储到你提供的变量中。在此示例中,我将 `i` 用于 _索引_,将 `v` 用于 _值_,但变量名称无关紧要。
|
2022-12-02 09:40:48 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ lua ./for.lua1: zombie2: Halloween3: apocalypse
|
|
|
|
|
```
|
|
|
|
|
|
2022-12-08 09:46:53 +08:00
|
|
|
|
### for 循环
|
2022-12-02 09:40:48 +08:00
|
|
|
|
|
2022-12-08 09:46:53 +08:00
|
|
|
|
`for` 循环结构在编程中很常见,由于经常使用表和 `pairs` 函数,因此在 Lua 中非常常见。了解 `for` 循环结构和控制它时的选项意味着你可以就如何在 Lua 中处理数据做出明智的决定。
|
2022-12-02 09:40:48 +08:00
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
via: https://opensource.com/article/22/11/lua-for-loops
|
|
|
|
|
|
|
|
|
|
作者:[Seth Kenlon][a]
|
|
|
|
|
选题:[lkxed][b]
|
|
|
|
|
译者:[geekpi](https://github.com/geekpi)
|
2022-12-08 09:46:53 +08:00
|
|
|
|
校对:[wxy](https://github.com/wxy)
|
2022-12-02 09:40:48 +08:00
|
|
|
|
|
|
|
|
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
|
|
|
|
|
|
|
|
|
[a]: https://opensource.com/users/seth
|
|
|
|
|
[b]: https://github.com/lkxed
|
|
|
|
|
[1]: https://opensource.com/article/22/11/lua-worth-learning
|
|
|
|
|
[2]: https://opensource.com/article/22/11/iterate-over-tables-lua
|
2022-12-08 09:46:53 +08:00
|
|
|
|
[0]: https://img.linux.net.cn/data/attachment/album/202212/08/094609xg8sgk832t0y6s68.jpg
|