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

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

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.