数组和 for 循环

我们看到数组可以像这样进行声明:

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

你可以通过使用 {:?} 请求它的 debug 表示来打印这样一个数组:

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

Rust 让你可以使用 for 关键字在类似数组和 range 这样的东西上进行迭代:

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!();
}

使用上面的知识写一个函数 pretty_print 漂亮地打印一个矩阵,以及一个函数 transpose 进行矩阵转换(将行转换为列):

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

将函数都硬编码为操作 3 × 3 的矩阵

复制下面的代码到 https://play.rust-lang.org/ 并实现函数:

// TODO: 当你完成实现后删除这个东西
#![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);
}

附加题

你可以使用 &[i32] 切片而不是硬编码的 3 × 3 矩阵作为你的参数和返回值类型吗?像 &[&[i32]] 这样的用于二维切片-的-切片的。为什么或为什么不?

查看 ndarray crate,一个生产级别质量的实现。

附加题的解决方案和答案在解决方案章节。