数组和 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
进行矩阵转换(将行转换为列):
将函数都硬编码为操作 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,一个生产级别质量的实现。
附加题的解决方案和答案在解决方案章节。