鏈結方法
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)時,你就可以用最佳的方式運用這種函數式風格。所以我們接下來將學會它們。