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):
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.