数组与 for 循环

我们可以这样声明一个数组:

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

你可以使用 {:?} 来打印这种数组的调试格式:

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

在 Rust 中,可以使用 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!();
}

使用以上知识,写一个用易读的格式输出矩阵的 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], // <-- 这个注释会让 rustfmt 添加一个新行
        [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 以了解该功能满足生产环境质量的实现。

题目解答和附加题的答案在 题解 章节中。

在“for n in &array”中使用引用“&array”这一做法巧妙地预先展示了下午将谈到的所有权问题。

如果不使用“&”…

  • 循环将会是一个使用数组的循环。这是一项在 2021 年版中引入的变更。
  • 会发生隐式数组复制。由于“i32”是复制类型,因此“[i32; 3]”也是复制类型。