Update control_flow.md

This commit is contained in:
sparklelcm333
2026-07-23 17:27:29 +08:00
committed by GitHub
parent 7f7897302f
commit dd0bf507c8

View File

@@ -58,7 +58,7 @@ $ cargo run
条件为假 条件为假
``` ```
还值得注意的是,这段代码中的条件 *必须* `bool` 值。当条件不是个 `bool` 值时,我们将得到一个报错。例如,请尝试运行以下代码: 还值得注意的是,这段代码中的条件 *必须* `bool` 值。当条件不是个 `bool` 值时,我们将得到一个报错。例如,请尝试运行以下代码:
文件名:`src/main.rs` 文件名:`src/main.rs`
@@ -245,7 +245,7 @@ fn main() {
``` ```
当我们运行这个程序时,我们将看到 `again!` 被不断打印,直到我们手动停止程序为止。大多数终端都支持 `crtl-C` 中断某个陷入连续循环程序。尝试一下: 当我们运行这个程序时,我们将看到 `again!` 被不断打印,直到我们手动停止程序为止。大多数终端都支持 `ctrl-C` 中断某个陷入连续循环程序。尝试一下:
```console ```console
@@ -280,7 +280,7 @@ again!
> ``` > ```
幸运的是Rust 也提供了使用代码跳出循环的方法。咱们可放置 `break` 关键字在循环中,告诉程序何时停止执行循环。回想一下,我们在第 2 章 的 [猜对后退出](../Ch02_Programming_a_Guessing_Game.md#猜对后的退出) 小节的猜数游戏中的猜数游戏中就这样做了,当用户猜对数字赢得游戏时退出程序。 幸运的是Rust 也提供了使用代码跳出循环的方法。咱们可放置 `break` 关键字在循环中,告诉程序何时停止执行循环。回想一下,我们在第 2 章 的 [猜对后退出](../Ch02_Programming_a_Guessing_Game.md#猜对后的退出) 小节的猜数游戏中就这样做了,当用户猜对数字赢得游戏时退出程序。
在猜数游戏中我们还使用了 `continue`,其在循环中会告诉程序,跳过循环的本次迭代中任何剩余代码,而前往下一次迭代。 在猜数游戏中我们还使用了 `continue`,其在循环中会告诉程序,跳过循环的本次迭代中任何剩余代码,而前往下一次迭代。
@@ -308,7 +308,7 @@ fn main() {
在其中的循环前,我们声明一个名为 `counter` 的变量并初始化其为 `0`。 然后,咱们声明一个名为 `result` 的变量保存从该循环返回的值。在该循环的每一次迭代时,我们都给 `counter` 变量加 `1`,然后检查 `counter` 是否等于 `10`。当等于 `10` 时,我们使用带有 `counter * 2` 值的 `break` 关键字。在这个循环之后,我们使用分号结束指派该值到 `result` 的语句。最后,我们打印 `result` 中的值,在本例中为 `20` 在其中的循环前,我们声明一个名为 `counter` 的变量并初始化其为 `0`。 然后,咱们声明一个名为 `result` 的变量保存从该循环返回的值。在该循环的每一次迭代时,我们都给 `counter` 变量加 `1`,然后检查 `counter` 是否等于 `10`。当等于 `10` 时,我们使用带有 `counter * 2` 值的 `break` 关键字。在这个循环之后,我们使用分号结束指派该值到 `result` 的语句。最后,我们打印 `result` 中的值,在本例中为 `20`
我们还可在循环内 `return``break` 只会退出当前循环,而 `return` 则始终会出当前函数。 我们还可在循环内 `return``break` 只会退出当前循环,而 `return` 则始终会退出当前函数。
> **译注**:这个示例还可写作如下。 > **译注**:这个示例还可写作如下。
@@ -337,7 +337,7 @@ fn main() {
### 以循环标签消除歧义 ### 以循环标签消除歧义
当咱们有着循环内的循环(译注:嵌套循环)时,`break``continue` 就会应用于该处的最内层循环。咱们可选择在某个循环上指定一个 *循环标签loop lable*,随后咱们可与 `break``continue` 一起使用,指定这两个关键字会应用到某个带标签的循环,而不是最内层循环。循环标签必须以单引号开头。下面是两个嵌套循环下的一个示例: 当咱们有着循环内的循环(译注:嵌套循环)时,`break``continue` 就会应用于该处的最内层循环。咱们可选择在某个循环上指定一个 *循环标签loop label*,随后咱们可与 `break``continue` 一起使用,指定这两个关键字会应用到某个带标签的循环,而不是最内层循环。循环标签必须以单引号开头。下面是两个嵌套循环下的一个示例:
```rust ```rust
@@ -367,7 +367,7 @@ fn main() {
``` ```
其中外层循环有着标签 `'counting_up`,他将从 `0` 计数到 `2`。不带标签的内循环会从 `10` 倒计数到 `9`。未指定标签的第一个 `break`,将只退出内层循环。那个 `break 'counting_up;` 语句将退出外层循环。这段代码会打印: 其中外层循环有着标签 `'counting_up`,他将从 `0` 计数到 `2`。不带标签的内循环会从 `10` 倒计数到 `9`。未指定标签的第一个 `break`,将只退出内层循环。那个 `break 'counting_up;` 语句将退出外层循环。这段代码会打印:
```console ```console
@@ -480,7 +480,7 @@ fn main() {
当咱们运行这段代码时,我们将看到与清单 3-4 同样的输出。更重要的是,我们现在提高了代码的安全性,并消除了超出数组末尾,或因遍历不足远而遗漏某些项目等可能导致的 bug 的可能性。自 `for` 循环生成的机器码也会更加高效,因为索引不需要在每次迭代时都与数组长度比较。 当咱们运行这段代码时,我们将看到与清单 3-4 同样的输出。更重要的是,我们现在提高了代码的安全性,并消除了超出数组末尾,或因遍历不足远而遗漏某些项目等可能导致的 bug 的可能性。自 `for` 循环生成的机器码也会更加高效,因为索引不需要在每次迭代时都与数组长度比较。
使用 `for` 循环时,当咱们修改了数组中值的个数时,咱们将不需要使用 [清单 3-4](#listing_3-4) 中用到的方法中那样,记住修改任何其他代码。 使用 `for` 循环时,当咱们修改了数组中值的个数时,咱们将不需要使用 [清单 3-4](#listing_3-4) 中用到的方法中那样,记住修改任何其他代码。
`for` 循环的安全性和简洁性,使其成为 Rust 中最常用到的循环结构。即使是在咱们打算运行某些代码一定次数的情形下,如清单 3-3 中使用 `while` 循环的倒计时示例中,大多数 Rustaceans 也会使用 `for` 循环。实现这点的方法,是使用由标准库提供的 `Range`,他会按顺序生成从一个数字开始到另一个数字前结束的所有数字。 `for` 循环的安全性和简洁性,使其成为 Rust 中最常用到的循环结构。即使是在咱们打算运行某些代码一定次数的情形下,如清单 3-3 中使用 `while` 循环的倒计时示例中,大多数 Rustaceans 也会使用 `for` 循环。实现这点的方法,是使用由标准库提供的 `Range`,他会按顺序生成从一个数字开始到另一个数字前结束的所有数字。
@@ -507,7 +507,7 @@ fn main() {
咱们做到了!这是蔚为壮观的一章:咱们学习了变量、标量与复合数据类型、函数、注释、`if` 表达式和循环!要练习这一章中讨论的概念,请尝试构建程序完成以下操作: 咱们做到了!这是蔚为壮观的一章:咱们学习了变量、标量与复合数据类型、函数、注释、`if` 表达式和循环!要练习这一章中讨论的概念,请尝试构建程序完成以下操作:
- 转换华氏和摄氏之间的温度; - 转换华氏和摄氏之间的温度;
- 生成第 n 个斐波拉基数; - 生成第 n 个斐波那契数;
- 利用圣诞颂歌 “The Twelve Days of Christmas” 中的重复,而打印出其歌词; - 利用圣诞颂歌 “The Twelve Days of Christmas” 中的重复,而打印出其歌词;
@@ -518,7 +518,7 @@ fn main() {
<details> <details>
<summary>“法式温度与摄氏温度的转换”</summary> <summary>“华氏温度与摄氏温度的转换”</summary>
```rust ```rust
use std::io; use std::io;
@@ -533,11 +533,11 @@ fn cels_to_fah(c: f32) -> f32 {
} }
fn main() { fn main() {
println! ("法式温度与摄氏温度之间的转换"); println! ("华氏温度与摄氏温度之间的转换");
loop { loop {
println! ("\n-----------------\n请选择: println! ("\n-----------------\n请选择:
'1'-摄氏温度/'2'-法式温度/'Q'/\"quit\" 退出程序。 '1'-摄氏温度/'2'-华氏温度/'Q'/\"quit\" 退出程序。
'1'/'2'/'Q'/\"quit\"[1]"); '1'/'2'/'Q'/\"quit\"[1]");
let mut temp_type = String::new(); let mut temp_type = String::new();
@@ -559,14 +559,14 @@ fn main() {
println! ("请输入要转换的摄氏温度:"); println! ("请输入要转换的摄氏温度:");
let temp = get_temp_input(); let temp = get_temp_input();
println! ("摄氏温度: {:.2}°C约为氏温度:{:.2}°F", temp, cels_to_fah(temp)); println! ("摄氏温度: {:.2}°C约为氏温度:{:.2}°F", temp, cels_to_fah(temp));
} }
if temp_type.eq("2") { if temp_type.eq("2") {
println! ("请输入要转换的氏温度:"); println! ("请输入要转换的氏温度:");
let temp = get_temp_input(); let temp = get_temp_input();
println! ("氏温度:{:.2}°F约为摄氏温度{:.2}°C", temp, fah_to_cels(temp)); println! ("氏温度:{:.2}°F约为摄氏温度{:.2}°C", temp, fah_to_cels(temp));
} }
} }
} }
@@ -594,7 +594,7 @@ fn get_temp_input() -> f32 {
<details> <details>
<summary>"生成第 n 个斐波拉基数"</summary> <summary>"生成第 n 个斐波那契数"</summary>
```rust ```rust
@@ -612,7 +612,7 @@ fn nth_fibonacci(n: u64) -> u64 {
} }
fn main() { fn main() {
println! ("找出第 n 个斐波拉基"); println! ("找出第 n 个斐波那契");
'main_loop: loop { 'main_loop: loop {
println! ("请输入 n: Q/quit 退出程序)"); println! ("请输入 n: Q/quit 退出程序)");
@@ -640,7 +640,7 @@ fn main() {
}; };
}; };
println! ("{} 个斐波拉基数为:{}", println! ("{} 个斐波那契数为:{}",
n, n,
nth_fibonacci(n).to_formatted_string(&Locale::en)); nth_fibonacci(n).to_formatted_string(&Locale::en));
} }
@@ -664,7 +664,7 @@ fn main() {
"sixth", "sixth",
"seventh", "seventh",
"eighth", "eighth",
"nineth", "ninth",
"tenth", "tenth",
"eleventh", "eleventh",
"twelfth" "twelfth"