Rust 從基礎到精通 — 第 6 講
使用集合、迭代器和閉包處理數據
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
Rust 的標準集合擁有它們儲存的值。 迭代器按類型區分讀取、借用或使用集合的方式。
Vec 和 HashMap
use std::collections::HashMap;
let mut party = Vec::new();
party.push(String::from("Rose"));
let mut items = HashMap::new();
items.insert(10, String::from("Potion"));
if let Some(name) = items.get(&10) {
println!("{name}");
}
Vec是一個有序列表,HashMap是透過key來找出值的。 因為 get 可能沒有值,所以它傳回 Option。
借用檢查器可防止在重新分配或修改集合時保留內部元素參考。
迭代器的所有權方法
for name in &party {
println!("{name}");
}
for name in &mut party {
name.push_str("_01");
}
&party 不可變地借用該元素,而 &mut party 則可變地借用該元素。 如果 party 本身是作為值重複,則該元素的所有權會發生移動,且以後無法使用原始元素。
迭代器和閉包
let mut alive: Vec<&Monster> = monsters
.iter()
.filter(|monster| monster.health > 0)
.collect();
alive.sort_by_key(|monster| monster.health);
iter 建立借用元素的迭代器,filter 只傳遞滿足條件的值。 最終集合是在呼叫collect 時建立的。
let bonus = 5;
let add_bonus = |damage: i32| damage + bonus;
可以透過借用或移動周圍的值來捕獲閉包。 如果閉包需要超出其原始範圍,則需要檢查是否需要 move 以及所有權去向。
不一定使用迭代器程式碼,因為它很快。 優點是可以分階段表達過濾和變換的意圖,同時保持所有權和借用方法。