函数和控制流
# 1 函数
Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并使用下划线分隔单词。这是一个包含函数定义示例的程序:
fn another_function() {
println!("Another function.");
}
fn another_function(x: i32) {
println!("The value of x is: {x}");
}
fn print_labeled_measurement(value: i32, unit_label: char) {
println!("The measurement is: {value}{unit_label}");
}
fn plus_one(x: i32) -> i32 {
x + 1
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2 控制流
# 2.1 if 表达式
if
表达式允许根据条件执行不同的代码分支。你提供一个条件并表示 “如果条件满足,运行这段代码;如果条件不满足,不运行这段代码。”
fn main() {
let number = 6;
if number % 4 == 0 {
println!("number is divisible by 4");
} else if number % 3 == 0 {
println!("number is divisible by 3");
} else if number % 2 == 0 {
println!("number is divisible by 2");
} else {
println!("number is not divisible by 4, 3, or 2");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
因为 if
是一个表达式,我们可以在 let
语句的右侧使用它
fn main() {
let condition = true;
let number = if condition { 5 } else { 6 };
println!("The value of number is: {number}");
}
2
3
4
5
6
# 2.2 使用循环重复执行
# 2.2.1 使用 loop 重复执行代码
# 从循环返回值
loop
的一个用例是重试可能会失败的操作,比如检查线程是否完成了任务。然而你可能会需要将操作的结果传递给其它的代码。要实现这一点,可以在用于停止循环的 break
表达式后添加你希望返回的值;这个值就会作为循环的返回值返回,这样你就可以使用它,如下所示:
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("The result is {result}");
}
2
3
4
5
6
7
8
9
10
11
12
13
在循环之前,我们声明了一个名为 counter
的变量并初始化为 0
。接着声明了一个名为 result
来存放循环的返回值。在循环的每一次迭代中,我们将 counter
变量加 1
,接着检查计数是否等于 10
。当相等时,使用 break
关键字返回值 counter * 2
。循环之后,我们通过分号结束赋值给 result
的语句。最后打印出 result
的值,也就是 20
。
# 循环标签:在多个循环之间消除歧义
如果存在嵌套循环,break
和 continue
应用于此时最内层的循环。你可以选择在一个循环上指定一个 循环标签(loop label),然后将标签与 break
或 continue
一起使用,使这些关键字应用于已标记的循环而不是最内层的循环。下面是一个包含两个嵌套循环的示例:
fn main() {
let mut count = 0;
'counting_up: loop {
println!("count = {count}");
let mut remaining = 10;
loop {
println!("remaining = {remaining}");
if remaining == 9 {
break;
}
if count == 2 {
break 'counting_up;
}
remaining -= 1;
}
count += 1;
}
println!("End count = {count}");
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
外层循环有一个标签 counting_up
,它将从 0 数到 2。没有标签的内部循环从 10 向下数到 9。第一个没有指定标签的 break
将只退出内层循环。break 'counting_up;
语句将退出外层循环。
# 2.2.2 while 条件循环
在程序中计算循环的条件也很常见。当条件为 true
,执行循环。当条件不再为 true
,调用 break
停止循环。
fn main() {
let mut number = 3;
while number != 0 {
println!("{number}!");
number -= 1;
}
println!("LIFTOFF!!!");
}
2
3
4
5
6
7
8
9
10
11
# 2.2.3 使用 for 遍历集合
for
循环的安全性和简洁性使得它成为 Rust 中使用最多的循环结构。
fn main() {
let a = [10, 20, 30, 40, 50];
for element in a {
println!("the value is: {element}");
}
}
fn main() {
for number in (1..4).rev() {
println!("{number}!");
}
println!("LIFTOFF!!!");
}
2
3
4
5
6
7
8
9
10
11
12
13
14