从 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 以及所有权去向。
不一定使用迭代器代码,因为它很快。 优点是可以分阶段表达过滤和变换的意图,同时保持所有权和借用方法。