Arrays y buclesfor
Hemos visto que un array se puede declarar de la siguiente manera:
#![allow(unused)] fn main() { let array = [10, 20, 30]; }
Puedes imprimir dicho array solicitando su representación de depuración con {:?}
:
fn main() { let array = [10, 20, 30]; println!("array: {array:?}"); }
Rust te permite iterar sobre elementos como arrays e intervalos usando la palabra clave for
:
fn main() { let array = [10, 20, 30]; print!("Iterating over array:"); for n in &array { print!(" {n}"); } println!(); print!("Iterating over range:"); for i in 0..3 { print!(" {}", array[i]); } println!(); }
Usa el método anterior para escribir una función pretty_print
que sirva para dar formato al texto de la matriz y una función transpose
que transponga una matriz (convertir filas en columnas):
Codifica ambas funciones para que operen con matrices de 3 × 3.
Copia el siguiente fragmento de código en https://play.rust-lang.org/ e implementa las funciones:
// TODO: remove this when you're done with your implementation. #![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], // <-- the comment makes rustfmt add a newline [201, 202, 203], [301, 302, 303], ]; println!("matrix:"); pretty_print(&matrix); let transposed = transpose(matrix); println!("transposed:"); pretty_print(&transposed); }
Pregunta Extra
¿Se podrían usar slices &[i32]
en lugar de matrices de 3 × 3 predefinidas en el código para tus argumentos y tipos de resultados devueltos? Por ejemplo, `&\[&\[i32\]\]\
para un slice de slices de dos dimensiones. ¿Por qué? ¿Por qué no?
Consulta el crate ndarray
para obtener una implementación con calidad de producción.
La solución y la respuesta a la pregunta extra están disponibles en la sección soluciones.
El uso de la referencia &array
dentro de for n in &array
es una vista previa sutil de los problemas de propiedad que se tratarán más tarde por la tarde.
Sin el &
…
- El bucle habría sido uno que consume el array. Este es un cambio introducido en la edición de 2021.
- Se habría producido una copia implícita del array. Dado que
i32
es un tipo de copia,[i32; 3]
también es un tipo de copia.