陣列和 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: 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);
}

加分題

您是否能夠使用 &[i32] 切片 (而非硬式編碼的 3 × 3 矩陣) 做為引數和傳回型別?例如針對二維切片使用 &[&[i32]]。原因為何?

請參閱 ndarray Crate,瞭解如何在確保實際工作環境品質的情況下實作。

如需加分題的解決方案和答案,請前往「解決方案」一節。

for n in &array 內使用 &array 參照項目是一個巧妙方式,可稍微預示下午將談到的擁有權問題。

沒有 & 的影響…

  • 迴圈會是取用陣列的迴圈。這是 2021 年版導入的變更。
  • 會發生隱含陣列複製的情形。由於 i32 是複製型別,因此 [i32; 3] 也會是複製型別。