Padrões e Desestruturação

Quando se trabalha com tuplas e outros valores estruturados, é comum querer extrair os valores internos em variáveis locais. Isso pode ser feito manualmente acessando diretamente os valores internos:

fn print_tuple(tuple: (i32, i32)) {
    let left = tuple.0;
    let right = tuple.1;
    println!("esquerda: {left}, direita: {right}");
}

No entanto, Rust também suporta o uso de correspondência de padrões (pattern matching) para desestruturar um valor maior em suas partes constituintes:

fn print_tuple(tuple: (i32, i32)) {
    let (left, right) = tuple;
    println!("esquerda: {left}, direita: {right}");
}
This slide should take about 5 minutes.
  • Os padrões usados aqui são "irrefutáveis", o que significa que o compilador pode verificar estaticamente que o valor à direita de = tem a mesma estrutura que o padrão.
  • Um nome de variável é um padrão irrefutável que sempre corresponde a qualquer valor, por isso podemos também usar let para declarar uma única variável.
  • Rust também suporta o uso de padrões em condicionais, permitindo a comparação de igualdade e desestruturação ao mesmo tempo. Esta forma de correspondência de padrões será discutida em mais detalhes posteriormente.
  • Edite os exemplos acima para mostrar o erro do compilador quando o padrão não corresponde ao valor sendo correspondido.