rust_learning/enum_match/
match_def.rs

1
2#[derive(Debug)] // 这样可以立刻看到州的名称
3enum UsState {
4    Alabama,
5    Alaska,
6    // --snip--
7}
8
9enum Coin {
10    Penny,
11    Nickel,
12    Dime,
13    Quarter(UsState),
14}
15
16fn value_in_cents(coin: Coin) -> u8 {
17    // 对于 if,表达式必须返回一个布尔值,而match它可以是任何类型的
18    // 一个分支有两个部分:一个模式和一些代码。第一个分支的模式是值 Coin::Penny 而之后的 => 运算符将模式和将要运行的代码分开。
19    // 这里的代码就仅仅是值 1。每一个分支之间使用逗号分隔。
20    // 每个分支相关联的代码是一个表达式,而表达式的结果值将作为整个 match 表达式的返回值。
21
22    // 如果想要在分支中运行多行代码,可以使用大括号,而分支后的逗号是可选的。
23    // 否则逗号必有
24    match coin {
25        Coin::Penny => 1,
26        Coin::Nickel => 5,
27        Coin::Dime => 10,
28        Coin::Quarter(state) => {
29            println!("State quarter from {:?}!", state);
30            25
31        }
32    }
33}
34
35/// 匹配
36pub fn match_def() {
37    // 对于 if,表达式必须返回一个布尔值,而match它可以是任何类型的
38
39    let some_u8_value = Some(0);
40    let a = 15;
41
42    let i = value_in_cents(Coin::Penny);
43    println!("i is {}", i);
44
45    let i = value_in_cents(Coin::Quarter(UsState::Alabama));
46    println!("i is {}", i)
47}
48
49/// 匹配Option
50pub fn option_match() {
51    let five = Some(5);
52    let six = plus_one(five);
53    println!("six is {:?}", six);
54    let none = plus_one(None);
55    println!("none is {:?}", none)
56}
57
58fn plus_one(x: Option<i32>) -> Option<i32> {
59    match x {
60        // 匹配是穷尽的
61        None => None,
62        Some(i) => Some(i + 1)
63    }
64}
65
66
67/// 匹配其他模式
68pub fn match_other() {
69    let x = 8;
70    match x {
71        1 | 2 => println!("one or two"),
72        3 => println!("three"),
73        // 变量 `other` 从未使用 ,可以在前面加上下划线(_other)就不会提示问题了
74        _other => println!("anything"),
75    }
76
77    // 当我们不想使用通配模式获取的值时,请使用 _ ,这是一个特殊的模式,可以匹配任意值而不绑定到该值。
78    match x {
79        1..=5 => println!("one through five"),
80        _ => println!("something else"),
81    }
82
83    match x {
84        1..=5 => println!("one through five"),
85        _ => (),
86    }
87}