A cobertura de tradução é parcial. Consulte a fonte em inglês para a referência técnica completa. Ver versão em inglês →

Correspondência de Padrões (Pattern Matching)

Correspondência de padrões exaustiva com expressões match, guardas de controlo e desestruturação de enums.

Correspondência de Padrões (Pattern Matching)

A expressão match oferece correspondência de padrões exaustiva sobre valores. O compilador verifica que todos os casos são cobertos e avisa sobre braços inalcançáveis.

Correspondência básica

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

O coringa _ corresponde a qualquer valor e é usado como cláusula catch-all.

Correspondência em enums

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))
        },
    }
}

Se você omitir uma variante, o compilador reporta um erro sobre correspondência não exaustiva.

Guards

Braços de padrão podem incluir guards if para condições adicionais:

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,
    }
}

Correspondência em structs

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,
    }
}

Limitações atuais

  • Desestruturação de tuplas em bindings let (let (a, b) = pair) ainda não é suportada. Use match em vez disso.
  • Correspondência de padrões aninhados em structs profundamente aninhadas funciona, mas ainda não é verificada exaustivamente em todos os casos.
  • Padrões de disjunção (A | B => ...) são parseados, mas a verificação de cobertura para eles ainda está amadurecendo.