翻譯未涵蓋全部內容。完整技術參考請查閱英文原文。 睇英文版 →

模式匹配

使用匹配表达式、守卫及嵌套模式进行详尽模式匹配。

模式匹配

match 表达式提供详尽模式匹配,编译器会检查所有情况是否被覆盖,并警告未被覆盖的分支。

基本匹配

fn describe(x: i32) -> i64 {
    match x {
        0 => 0,
        1 => 1,
        _ => 2,
    }
}

通配符 _ 匹配任何值,用作捕获所有。

枚举匹配

enum Shape {
    Circle(f64),
    Rectangle(f64, f64),
    Triangle(f64, f64, f64),
}

fn sqrt(x: f64) -> f64 { x }

fn area(s: Shape) -> f64 {
    match s {
        Shape::Circle(r) => 3.14159 * r * r,
        Shape::Rectangle(w, h) => w * h,
        Shape::Triangle(a, b, c) => {
            let s = (a + b + c) / 2.0
            sqrt(s * (s - a) * (s - b) * (s - c))
        },
    }
}

如果你省略了一个变体,编译器会报告非详尽匹配错误。

守卫

模式臂可以包含 if 守卫以进行额外条件判断:

fn classify_temp(celsius: f64) -> i64 {
    match celsius {
        t if t < 0.0 => 0,
        t if t < 20.0 => 1,
        t if t < 35.0 => 2,
        _ => 3,
    }
}

结构体匹配

struct Point { x: f64, y: f64 }

fn quadrant(p: Point) -> i64 {
    match p {
        Point { x, y } if x > 0.0 && y > 0.0 => 1,
        Point { x, y } if x < 0.0 && y > 0.0 => 2,
        Point { x, y } if x < 0.0 && y < 0.0 => 3,
        Point { x, y } if x > 0.0 && y < 0.0 => 4,
        _ => 0,
    }
}

当前限制

  • let 绑定中的元组解构 (let (a, b) = pair) 尚未支持。请使用 match 代替。
  • 嵌套模式匹配在深度嵌套的结构体上工作,但并非所有情况下都被详尽检查。
  • 或模式 (A | B => ...) 被解析,但对它们的覆盖检查仍在发展中。