控制流运算符-match

83 阅读1分钟

1.match

允许一个值与一系列模式进行匹配,并执行匹配成功的模式所对应的代码

模式可以是字面值、变量名、通配符

enum Coin {
    Fen,
    Jiao,
    Yuan,
    Baiyuan,
}

fn main() {
    println!("Hello, world!");
    let a = value_in_cents(Coin::Fen);
    println!("{}",a);
}

fn value_in_cents(coin: Coin) -> u32 {
    match coin {
        Coin::Fen => {
            println!("我是1分");
            1
        },
        Coin::Jiao => 10,
        Coin::Yuan => 100,
        Coin::Baiyuan => 10000,
    }
}

2.绑定值的模式匹配

匹配的分支可以绑定被匹配对象的部分值,因此可以从enum变体中提取值

enum Coin {
    Fen,
    Jiao,
    Yuan,
    Baiyuan,
    Quarter(Province),
}

#[derive(Debug)]
enum Province {
    Hebei,
    Beijing,
}

fn main() {
    println!("Hello, world!");
    let a = value_in_cents(Coin::Fen);
    println!("{}",a);
    let b = value_in_cents(Coin::Quarter(Province::Beijing));
    println!("{}",b);
}

fn value_in_cents(coin: Coin) -> u32 {
    match coin {
        Coin::Fen => {
            println!("我是1分");
            1
        },
        Coin::Jiao => 10,
        Coin::Yuan => 100,
        Coin::Baiyuan => 10000,
        Coin::Quarter(state) => {
            println!("{:?}",state);
            1000
        }
    }
}

这里是把一个为枚举的值传入到了enum变体中

3.匹配 Option< T >

fn main() {
    let one = Some(1);
    let two = add_one(one);
    let none = add_one(None);
    println!("{:?}{:?}{:?}",one,two,none); // Some(1)Some(2)None
}

fn add_one(x: Option<i32>) -> Option<i32> {
    match x {
        None => None,
        Some(i) => Some(i + 1),
    }
}

4.match 匹配的时候必须穷举所有可能

需要注意的是,在匹配Option< T >的时候,要考虑None的情况

如果有很多,不想都写上,可以使用_下划线通配符来代替其余没有列出的值

fn main() {
    let v = 1u8;
    match v {
        1 => println!("1"),
        2 => println!("2"),
        _ => (),
    }
    println!("{}",v);
}

如果v = 0,那么输出一个1

如果v = 1,那么输出两个1