12_rust的match、if let

match

强大的控制流运算符。

  • 允许一个值和一系列模式进行匹配,并执行匹配的模式对于的代码
  • 模式可为字面值、变量名、通配符...
    比如下边例子用于匹配返回具体值
enum Color {
    Black,
    White,
    Red,
}

fn value_Color(color: Color) -> u32 {
    match color { // 匹配枚举,从第一行开始逐行匹配,匹配到后已箭头后的返回值作为match的返回值
        Color::Black => { // 多行语句可加{}后+一返回值
            println!("black");
            0x0;
        },
        Color::White => 0xffffff, // 单行可直接返回数值
        Color::Red => 0xff0000,
    }
}
fn main() {}

绑定值的模式

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

#[derive(Debug)]
enum WeekDay {
    MOD,
    TUS,
    WED,
}
enum Timekeep {
    Hour,
    Day,
    Week(WeekDay), // 让其关联一数据,是一枚举
}

fn value_in_timekeep(t: Timekeep) -> u8 {
    match t {
        Timekeep::Hour => 0,
        Timekeep::Day => 1,
        Timekeep::Week(w) => { // 因为变体里能存值,所以用w变量绑定到所存的值里,这就是绑定值的模式
            println("weekday {:?}", w);
            2
        }
    }
}
fn main() {
    let w = Timekeep::Week(WeekDay::MOD);
    println("{}", value_in_timekeep(w));
}

匹配Option<T>

就是匹配option的some和None。

fn main() {
    let five = Some(5);
    let six = add_one(five);
    let none = add_one(None);
}

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

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

就是enum里定义了几个,就要全部穷举出来,不然会报non-exhaustive patterns:xxxx not covered的错误,意思是确实xxx匹配。
如果enum的成员数量太多,只想匹配部分,则可使用 “_通配符” 替代其余没有列出来的值。

fn main() {
    let v = 0u8;
    match v { // 枚举u8所有的可能值,但有256种,仅想处理其中几个
        1 => println!("one"),
        2 => println!("two"),
        3 => println!("three"),
        _ => (), // 其余的走这个匹配,通配符要放最好,返回值空tuple,即什么都不做。
    }
}

if let

if let是match的特殊形式语法糖,处理只关心一种匹配而忽略其他匹配的情况。
整体更简单,无需穷举其他,也可搭配else处理其他情况。

fn main() {
    let v = Some(0u8);
    match v { // 比如只要处理一种情况,match语法如下
        Some(1) => println!("one"),
        _ => (), // 其余的走这个匹配,通配符要放最好,返回值空tuple,即什么都不做。
    }
    if let Some(1) = v { // 表示只处理值为1的情况,其他情况不处理,效果和上面match 一样
        println("one");
    } else { // 其他情况
        println!("others")
    }
}
posted @ 2023-10-20 00:36  00lab  阅读(27)  评论(0编辑  收藏  举报