鏈結方法

Rust 是一種系統程式語言,就像 C 和 C++ 一樣,它的程式碼可以寫成獨立的命令,單獨成行,但它也有函數式風格(functional style)。兩種風格都可以,但函數式通常比較短。下面以非函數式(稱為"命令式(imperative style)")為例,做出從 1 到 10 的 Vec

fn main() {
    let mut new_vec = Vec::new();
    let mut counter = 1;

    while counter < 11 {
        new_vec.push(counter);
        counter += 1;
    }

    println!("{:?}", new_vec);
}

印出 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

而這裡是函式式風格的範例:

fn main() {
    let new_vec = (1..=10).collect::<Vec<i32>>();
    // 或者你能寫成像這樣:
    // let new_vec: Vec<i32> = (1..=10).collect();
    println!("{:?}", new_vec);
}

.collect() 可以做出很多型別的集合,所以我們要告訴它型別。

你可以用函數式風格來鏈結方法。"鏈結方法"的意思是把很多方法放在一個陳述式中。這裡是一個有很多方法鏈結在一起的範例:

fn main() {
    let my_vec = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    let new_vec = my_vec.into_iter().skip(3).take(4).collect::<Vec<i32>>();

    println!("{:?}", new_vec);
}

這樣就建立了一個是 [3, 4, 5, 6] 的 Vec。這一行的資訊量很大,所以把每個方法放在新的一行上會有幫助。讓我們這樣做,讓它更容易閱讀:

fn main() {
    let my_vec = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    let new_vec = my_vec
        .into_iter() // "迭代"過所有元素 (iterate = 處理它裡面的每個項目). into_iter() 給我們的是具所有權的數值, 而非參考
        .skip(3) // 略過三個項目: 0, 1, 和 2
        .take(4) // 拿取後面四個: 3, 4, 5, 和 6
        .collect::<Vec<i32>>(); // 把它們放進新的 Vec<i32>

    println!("{:?}", new_vec);
}

當你瞭解閉包(closure)和疊代器(iterator)時,你就可以用最佳的方式運用這種函數式風格。所以我們接下來將學會它們。