mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2026-08-19 04:33:27 +08:00
Update control_flow.md
This commit is contained in:
@@ -58,7 +58,7 @@ $ cargo run
|
||||
条件为假
|
||||
```
|
||||
|
||||
还值得注意的是,这段代码中的条件 *必须* 要个 `bool` 值。当条件不是个 `bool` 值时,我们将得到一个报错。例如,请尝试运行以下代码:
|
||||
还值得注意的是,这段代码中的条件 *必须* 是个 `bool` 值。当条件不是个 `bool` 值时,我们将得到一个报错。例如,请尝试运行以下代码:
|
||||
|
||||
|
||||
文件名:`src/main.rs`
|
||||
@@ -245,7 +245,7 @@ fn main() {
|
||||
```
|
||||
|
||||
|
||||
当我们运行这个程序时,我们将看到 `again!` 被不断打印,直到我们手动停止程序为止。大多数终端都支持 `crtl-C` 中断某个陷入连续循环程序。尝试一下:
|
||||
当我们运行这个程序时,我们将看到 `again!` 被不断打印,直到我们手动停止程序为止。大多数终端都支持 `ctrl-C` 中断某个陷入连续循环程序。尝试一下:
|
||||
|
||||
|
||||
```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`,其在循环中会告诉程序,跳过循环的本次迭代中任何剩余代码,而前往下一次迭代。
|
||||
|
||||
@@ -308,7 +308,7 @@ fn main() {
|
||||
|
||||
在其中的循环前,我们声明一个名为 `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
|
||||
@@ -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
|
||||
@@ -480,7 +480,7 @@ fn main() {
|
||||
|
||||
当咱们运行这段代码时,我们将看到与清单 3-4 同样的输出。更重要的是,我们现在提高了代码的安全性,并消除了超出数组末尾,或因遍历不足远而遗漏某些项目等可能导致的 bug 的可能性。自 `for` 循环生成的机器码也会更加高效,因为索引不需要在每次迭代时都与数组长度比较。
|
||||
|
||||
使用 `for` 循环时,当咱们修改了数组中值的个数时,咱们将不需要向使用 [清单 3-4](#listing_3-4) 中用到的方法中那样,记住修改任何其他代码。
|
||||
使用 `for` 循环时,当咱们修改了数组中值的个数时,咱们将不需要像使用 [清单 3-4](#listing_3-4) 中用到的方法中那样,记住修改任何其他代码。
|
||||
|
||||
`for` 循环的安全性和简洁性,使其成为 Rust 中最常用到的循环结构。即使是在咱们打算运行某些代码一定次数的情形下,如清单 3-3 中使用 `while` 循环的倒计时示例中,大多数 Rustaceans 也会使用 `for` 循环。实现这点的方法,是使用由标准库提供的 `Range`,他会按顺序生成从一个数字开始到另一个数字前结束的所有数字。
|
||||
|
||||
@@ -507,7 +507,7 @@ fn main() {
|
||||
咱们做到了!这是蔚为壮观的一章:咱们学习了变量、标量与复合数据类型、函数、注释、`if` 表达式和循环!要练习这一章中讨论的概念,请尝试构建程序完成以下操作:
|
||||
|
||||
- 转换华氏和摄氏之间的温度;
|
||||
- 生成第 n 个斐波拉基数;
|
||||
- 生成第 n 个斐波那契数;
|
||||
- 利用圣诞颂歌 “The Twelve Days of Christmas” 中的重复,而打印出其歌词;
|
||||
|
||||
|
||||
@@ -518,7 +518,7 @@ fn main() {
|
||||
|
||||
|
||||
<details>
|
||||
<summary>“法式温度与摄氏温度的转换”</summary>
|
||||
<summary>“华氏温度与摄氏温度的转换”</summary>
|
||||
|
||||
```rust
|
||||
use std::io;
|
||||
@@ -533,11 +533,11 @@ fn cels_to_fah(c: f32) -> f32 {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println! ("法式温度与摄氏温度之间的转换");
|
||||
println! ("华氏温度与摄氏温度之间的转换");
|
||||
|
||||
loop {
|
||||
println! ("\n-----------------\n请选择:
|
||||
'1'-摄氏温度/'2'-法式温度/'Q'/\"quit\" 退出程序。
|
||||
'1'-摄氏温度/'2'-华氏温度/'Q'/\"quit\" 退出程序。
|
||||
'1'/'2'/'Q'/\"quit\"[1]:");
|
||||
|
||||
let mut temp_type = String::new();
|
||||
@@ -559,14 +559,14 @@ fn main() {
|
||||
println! ("请输入要转换的摄氏温度:");
|
||||
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") {
|
||||
println! ("请输入要转换的法氏温度:");
|
||||
println! ("请输入要转换的华氏温度:");
|
||||
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>
|
||||
<summary>"生成第 n 个斐波拉基数"</summary>
|
||||
<summary>"生成第 n 个斐波那契数"</summary>
|
||||
|
||||
|
||||
```rust
|
||||
@@ -612,7 +612,7 @@ fn nth_fibonacci(n: u64) -> u64 {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println! ("找出第 n 个斐波拉基数");
|
||||
println! ("找出第 n 个斐波那契数");
|
||||
|
||||
'main_loop: loop {
|
||||
println! ("请输入 n: (Q/quit 退出程序)");
|
||||
@@ -640,7 +640,7 @@ fn main() {
|
||||
};
|
||||
};
|
||||
|
||||
println! ("第 {} 个斐波拉基数为:{}",
|
||||
println! ("第 {} 个斐波那契数为:{}",
|
||||
n,
|
||||
nth_fibonacci(n).to_formatted_string(&Locale::en));
|
||||
}
|
||||
@@ -664,7 +664,7 @@ fn main() {
|
||||
"sixth",
|
||||
"seventh",
|
||||
"eighth",
|
||||
"nineth",
|
||||
"ninth",
|
||||
"tenth",
|
||||
"eleventh",
|
||||
"twelfth"
|
||||
|
||||
Reference in New Issue
Block a user