Matrizes (Arrays) e Loops (Laços) for

Vimos que uma matriz pode ser declarada assim:

#![allow(unused)]
fn main() {
let array = [10, 20, 30];
}

Você pode imprimir tal matriz solicitando sua representação de depuração com {:?}:

fn main() {
    let array = [10, 20, 30];
    println!("matriz: {array:?}");
}

Rust permite iterar em coisas como matrizes e ranges (faixas ou intervalos) usando a palavra-chave for:

fn main() {
    let array = [10, 20, 30];
    print!("Iterando sobre a matriz:");
    for n in &array {
        print!(" {n}");
    }
    println!();

    print!("Iterando sobre um range:");
    for i in 0..3 {
        print!(" {}", array[i]);
    }
    println!();
}

Use o exercício acima para escrever uma função pretty_print que imprime uma matriz e uma função transpose que irá transpor uma matriz (transformar linhas em colunas):

2584567⎤8⎥9⎦transpose==1473⎤6⎥9⎦123

Limite ambas as funções a operar em matrizes 3 × 3.

Copie o código abaixo para https://play.rust-lang.org/ e implemente as funções:

// TODO: remova isto quando você terminar sua implementação .
#![allow(unused_variables, dead_code)]

fn transpose(matrix: [[i32; 3]; 3]) -> [[i32; 3]; 3] {
    unimplemented!()
}

fn pretty_print(matrix: &[[i32; 3]; 3]) {
    unimplemented!()
}

fn main() {
    let matrix = [
        [101, 102, 103], // <-- o comentário faz com que o rustfmt adicione uma nova linha
        [201, 202, 203],
        [301, 302, 303],
    ];

    println!("matriz:");
    pretty_print(&matrix);

    let transposed = transpose(matrix);
    println!("transposta:");
    pretty_print(&transposed);
}

Pergunta Bônus

Você poderia usar slices &[i32] em vez de matrizes 3 × 3 fixas no código para o seu argumento e tipos de retorno? Algo como &[&[i32]] para um slice-de-slices bidimensional. Por que sim ou por que não?

Veja o crate ndarray para uma implementação de produção.

A solução e a resposta para a seção de bônus estão disponíveis na Seção Soluções.

O uso da referência &matriz em for n in &matriz é uma prévia sutil das questões de propriedade que surgirão à tarde.

Sem o &

  • O loop teria sido o que consome a matriz. Esta é uma mudança introduzida na Edição de 2021.
  • Uma cópia implícita da matriz teria ocorrido. Como i32 é um tipo de cópia (copy type), então [i32; 3] também é um tipo de cópia.