Redian新闻
>
Rust 基础系列 #7: 在 Rust 中使用循环 | Linux 中国

Rust 基础系列 #7: 在 Rust 中使用循环 | Linux 中国

科技
 
导读:另一种方法是使用循环。因此,让我们在本文中看看循环。                               
本文字数:5444,阅读时长大约:7分钟

在 Rust 系列的 上一篇文章🔗 linux.cn 中,我介绍了如何使用 if 和 else 关键字来处理 Rust 程序的控制流。

这是处理程序控制流的一种方法。另一种方法是使用循环。因此,让我们在本文中看看循环。

Rust 中可用的循环

Rust 编程语言有三种不同的循环,基于你想要实现什么以及可用的内容:

◈ for
◈ while
◈ loop

我假设你对 for 和 while 已经很熟悉了,但 loop 对你来说可能是个新概念。让我们先从熟悉的概念开始。

for 循环

for 循环主要用于迭代一种称为迭代器的东西。

这个迭代器可以从任何东西中创建,从数组、向量(很快就会介绍!)、一系列值,或者任何自定义的东西。这里的可能性是无限的。

来看看 for 循环的语法。

  1. for 迭代变量 in 迭代器 {
  2. <语句>;
  3. }

其中的 迭代变量 在大多数其他编程语言教程中通常被称为 i ; )

迭代器 可以是任何东西,只要它能告诉下一个值是什么,如果有的话。

来通过一个程序来理解这个。

  1. fn main() {
  2. let my_arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  3. println!("迭代数组");
  4. for element in my_arr {
  5. println!("{}", element);
  6. }
  7. println!("\n迭代一个真正的迭代器");
  8. for element in my_arr.iter() {
  9. println!("{}", element);
  10. }
  11. println!("\nPython 风格的范围");
  12. for element in 0..10 {
  13. println!("{}", element);
  14. }
  15. }

这里,我声明了一个数组,它包含从 0 到 9 的 10 个数字。在第 5 行的 for 循环中,我只是将这个数组指定为迭代器,Rust 会自动处理对这个数组的所有元素的迭代。不需要花哨的 my_arr[i] 魔法。

但是,在第 10 行,我调用了 .iter() 函数。这是一个明确的提及,它基于 my_arr 的值来获取一个迭代器。这个循环和第 5 行的循环之间唯一的区别是,这里你是通过在数组上调用 .iter() 函数来明确地调用它的。

在这个上下文环境中,在一个数据类型上调用 .iter() 函数不是必须的。因为这是一个数组,是语言本身提供的一种数据类型,Rust 已经知道如何处理它了。但是你 需要 在自定义数据类型中使用它。

最后,在第 15 行,我们有一个循环,它循环遍历一个范围。嗯,差不多是这样。如果你仔细看,这个范围看起来很像切片 “类型”。Rust 也知道这一点,并且  你处理了迭代(哈哈,明白了吗?)。

LCTT 译注:此处的梗是,“为你处理了迭代” 的英文原文是 “handles iteration for you",其中的 “for” 与 “for 循环” 的 “for” 是同一个单词。

输出如下:

  1. 迭代数组
  2. 0
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. 迭代一个真正的迭代器
  13. 0
  14. 1
  15. 2
  16. 3
  17. 4
  18. 5
  19. 6
  20. 7
  21. 8
  22. 9
  23. Python 风格的范围
  24. 0
  25. 1
  26. 2
  27. 3
  28. 4
  29. 5
  30. 6
  31. 7
  32. 8
  33. 9

while 循环

while 循环可以被认为是非常类似于 if 条件语句。使用 if 语句,只要用户提供的条件为 trueif 语句体中的代码就会被执行 一次

但是,在 while 循环中,如果条件评估为 true,循环就会开始循环循环体。只要条件继续评估为 true,循环就会继续迭代。

while 循环只有在循环完成当前迭代中所有语句的执行并且在检查条件时,它的结果为 false 时才会停止。

来看看 while 循环的语法...

  1. while 条件 {
  2. <语句>;
  3. }

看到了吗?和 if 条件语句非常相似!不过没有 else 块 ; )

来看一个程序来更好地理解这个。

  1. fn main() {
  2. let mut var = 0;
  3. while var < 3 {
  4. println!("{var}");
  5. var += 1;
  6. }
  7. }

我有一个可变变量 var,它的初始值为 0。只要可变变量 var 中存储的值小于 3,while 循环就会执行。

在循环中,var 的值被打印出来,然后它的值被增加 1。

这是上面代码的输出:

  1. 0
  2. 1
  3. 2

loop 循环

Rust 有一个无限循环。是的,一个没有开始条件和停止条件的循环。它只是一直循环,直到永远。当然,它有触发器来停止代码本身的循环执行。

无限循环的语法如下:

  1. loop {
  2. <语句>;
  3. }

📋 这些循环主要用于 GUI 软件,退出是一个 显式 操作。

在我给你一个例子之前,因为这个循环非常特殊,让我们先看看如何 退出 它 :p

要停止无限循环的执行,需要在循环内使用 break 关键字。

来看一个例子,只有 0 到 3 之间的整数(包括 0 和 3)才会被打印到程序输出。

  1. fn main() {
  2. let mut var = 0;
  3. loop {
  4. if var > 3 {
  5. break;
  6. }
  7. println!("{}", var);
  8. var += 1;
  9. }
  10. }

看待这个特定的例子的最好方法是将它看作是一个增加了一堆没有必要的东西的 while 循环 ; )

你有一个可变变量 var,它的初始值为 0,它被用作迭代器。无限循环从一个 if 条件开始,如果 var 的值大于 3,break 关键字就会被执行。后来,就像 while 循环的前一个例子一样,var 的值被打印到标准输出,然后它的值被增加 1。

它的输出如下:

  1. 0
  2. 1
  3. 2
  4. 3

标记循环

假设有两个无限循环,一个嵌套在另一个中。由于某种原因,退出条件在最内层循环中被检查,但这个退出条件是为了退出最外层循环。

在这种情况下,标记循环可能是有益的。

💡 break 和 continue 关键字并不仅仅用于无限循环。它们可以用于 Rust 语言提供的所有三种循环。

接下来是如何标记循环。

  1. '标记: loop {}

要告诉编译器一个循环被标记了,从一个单引号字符开始,输入它的标签,然后跟着一个冒号。然后,继续使用你通常定义循环的方式。

当你需要退出某个循环时,只需像这样指定循环标签:

  1. break '标记;

来看一个例子来更好地理解这个。

  1. fn main() {
  2. let mut a = 0;
  3. let mut b = 0;
  4. 'parent: loop {
  5. a += 1;
  6. loop {
  7. println!("a: {}, b: {}", a, b);
  8. b += 1;
  9. if a + b == 10 {
  10. println!("\n{} + {} = 10", a, b);
  11. break 'parent;
  12. }
  13. }
  14. }
  15. }

这里,我使用两个可变变量 a 和 b,它们的初始值都设置为 0。

然后,最外层的循环被标记为 parentparent 循环将变量 a 的值增加 1,并有一个内部/子循环。

这个(在第 8 行的)子循环打印变量 a 和 b 的值。在这个循环内部,变量 b 的值增加了 1。退出条件是 a + b == 10。这意味着只要变量 a 和 b 中存储的值相加,结果为 10,parent 循环就会被打破。即使第 14 行的 break 条件“属于”内部循环,它也会打破 parent 循环。

来看看程序的输出。

  1. a: 1, b: 0
  2. a: 1, b: 1
  3. a: 1, b: 2
  4. a: 1, b: 3
  5. a: 1, b: 4
  6. a: 1, b: 5
  7. a: 1, b: 6
  8. a: 1, b: 7
  9. a: 1, b: 8
  10. 1 + 9 = 10

就像从程序输出中可以看出的那样,循环在 a 和 b 分别具有值 1 和 9 时停止。

continue 关键字

如果你已经在其他编程语言(如 C/C++/Java/Python)中使用过循环,你可能已经知道 continue 关键字的用法。

当 break 关键字用于完全停止循环执行时,continue 关键字用于“跳过”循环执行的 当前迭代 并从下一迭代开始(如果条件允许)。

来看一个例子来理解 continue 关键字的工作原理。

  1. fn main() {
  2. for i in 0..10 {
  3. if i % 2 == 0 {
  4. continue;
  5. }
  6. println!("{}", i)
  7. }
  8. }

在上面的代码中,我有一个 for 循环,它迭代了 0 到 9 之间的整数(包括 0 和 9)。一旦循环开始,我就设置了一个条件检查,看看这个数字是不是偶数。如果这个数字是偶数,continue 关键字就会被执行。

但是如果这个数字是奇数,这个数字就会被打印到程序输出。

来看看这个程序的输出。

  1. 1
  2. 3
  3. 5
  4. 7
  5. 9

正如你所看到的,循环似乎一直在“进行”,尽管 0 到 9 之间显然有偶数。但是因为我使用了 continue 关键字,当遇到这个关键字时,循环执行就会停止。

这个循环跳过了它下面的任何东西,并继续下一次迭代。这就是为什么偶数没有被打印出来,但是 0 到 9 之间的所有奇数都被打印到了程序输出中。

总结

要总结这篇长文,我演示了 3 种不同循环的用法:forwhile 和 loop。我还讨论了两个关键字,它们影响这些循环的控制流:break 和 continue

我希望你现在能理解每个循环的适当用例。如果你有任何问题,请告诉我。

(题图:MJ/25579e09-ae1c-47d3-8266-3bd9a54456c0)


via: https://itsfoss.com/rust-loops/

作者:Pratham Patel 选题:lkxed 译者:Cubik65536 校对:wxy

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

LCTT 译者 :Qian Qian \"Cubik\"‎
🌟🌟🌟
翻译: 20.0 篇
|
贡献: 253 天
2022-10-04
2023-06-14
https://linux.cn/lctt/Cubik65536
欢迎遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “转载:公众号名称”,
我们将为您添加白名单,授权“转载文章时可以修改”。


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
在Linux系统中使用Vim读写远程文件的命令详解risiOS:一个易于使用的基于 Fedora 的 Linux 发行版 | Linux 中国如何在 Rocky Linux 9 / AlmaLinux 9 上安装 KVM | Linux 中国终端基础:在 Linux 中删除文件和文件夹 | Linux 中国TUXEDO Stellaris 16(Gen5)是目前所能找到的终极 Linux 笔记本电脑 | Linux 中国使用 Linux 让旧电脑焕发新颜 | Linux 中国Bash 基础知识系列 #6:处理字符串操作 | Linux 中国Bash 基础知识系列 #2:在 Bash 中使用变量 | 技术Bash 基础知识系列 #3:传递参数和接受用户输入 | Linux 中国为什么黑客更喜欢使用 Kali Linux? | Linux 中国在 Linux 中使用 cd 命令 | Linux 中国在 Linux 中使用 cp 命令 | Linux 中国文革记忆 (一)使用 ChatGPT AI 从英文文本生成 Linux 命令 | Linux 中国Rust 基础系列 #5: Rust 中的函数 | Linux 中国在 Linux 中使用 cat 命令 | Linux 中国Bash 基础知识系列 #1:创建并运行你的第一个 Bash Shell 脚本 | Linux 中国从今天起,可以躺平了【感动我的歌曲】一首曲子的春天想象双声子 南山晨雪火星人的大棋和小花招Linux0基础入门,教你如何在Shell中使用正则表达式Bash 基础知识系列 #7:If Else 语句 | Linux 中国结合使用 Python 和 Rust | Linux 中国将 Linux 终端与 Nautilus 文件管理器结合起来 | Linux 中国低价开团丨台立两用循环风扇,小巧方便,夏天用太合适了Rust 基础系列 #4: Rust 中的数组和元组 | Linux 中国Bash 基础知识系列 #5:在 Bash 中使用数组 | Linux 中国终端基础:在 Linux 中复制文件和目录 | Linux 中国Rust 基础系列 #2: 在 Rust 程序中使用变量和常量 | Linux 中国Agustín Hernández:中美洲建筑背景下的未来主义巨构Rust 基础系列 #8:编写里程碑 Rust 程序 | Linux 中国你的旧电脑是 “过时” 了,还是使用 Linux 的机会? | Linux 中国Rust 基础系列 #6: 条件语句 | Linux 中国Rust 基础系列 #3: Rust 中的数据类型 | Linux 中国
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。