数组与 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
函数:
硬编码这两个函数,让它们处理 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]”也是复制类型。