match
允许我们将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。
上一节我们学习了Option<T>
,这一节我们就来学习下,如何处理Option<T>
1
2
3
4
5
6
7
8
9
10
11
12
|
fn main() {
let x: i8 = 5;
let y: Option<i8> = Some(5);
// 处理`Option`
let z = match y {
Some(i) => i,
None => 0,
};
let sum = i + z;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
fn main() {
// _ 通配符
// Rust 也提供了一个模式用于不想列举出所有可能值的场景。
// 例如,u8 可以拥有 0 到 255 的有效的值,如果我们只关心 1、3、5 和 7 这几个值,
// 就并不想必须列出 0、2、4、6、8、9 一直到 255 的值。
// 所幸我们不必这么做:可以使用特殊的模式 _ 替代:
let value: u8 = 3;
match value {
1 => println!("one"),
3 => println!("three"),
5 => println!("five"),
7 => println!("seven"),
_ => (),
};
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
enum Coin {
Penny,
Nickel,
Dime,
Quarter,
}
fn value_in_cents(coin: Coin) -> u8 {
match coin {
// 如果想要在分支中运行多行代码,可以使用大括号。
Coin::Penny => {
println!("Lucky penny");
1
}
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter => 25,
}
}
fn main() {
let coin1 = Coin::Penny;
let penny = value_in_cents(coin1);
println!("This value of penny is: {}", penny);
}
|
- 示例4 匹配分支的另一个有用的功能是可以绑定匹配的模式的部分值。这也就是如何从枚举成员中提取值的。
这和示例1中的,匹配Option<T>
的 Some(i)
成员是一样的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
enum UsState {
Alabama,
Alaska,
// --snip--
}
enum Coin {
Penny,
Nickel,
Dime,
Quarter(UsState),
}
fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter(state) => {
println!("State quarter from {:?}!", state);
25
}
}
}
fn main() {
// 匹配分支的另一个有用的功能是可以绑定匹配的模式的部分值。这也就是如何从枚举成员中提取值的。
let coin = Coin::Quarter(UsState::Alaska);
let quarter = value_in_cents(coin);
println!("This value of quarter is: {}", quarter);
}
|
_
通配符可以匹配所有模式
- 匹配是穷尽的,也就是说,你必须处理所有的模式