Rust_2025:阶段1:day6.1 collect补充 ,迭代器补充 ,闭包,Hashmap搜索指定值的个数,合并迭代器
collect
-
如果你写 collect::<Vec<Result<T, E>>>(),它会把迭代器里的每个元素(Result)都收集到一个 Vec 里,得到的是 Vec<Result<T, E>>。
如果你写 collect::<Result<Vec, E>>(),它会尝试把所有 Ok(T) 收集到 Vec 里,只要遇到一个 Err(E) 就直接返回这个 Err,得到的是 Result<Vec, E>。
Option 也是一样: -
collect::<Vec<Option>>() 得到 Vec<Option>
-
collect::<Option<Vec>>() 得到 Option<Vec>
fn result_with_list() -> Result<Vec<i32>, DivisionError> {let numbers = vec![27, 297, 38502, 81];numbers.into_iter().map(|n| divide(n, 27)).collect()
}fn list_of_results() -> Vec<Result<i32, DivisionError>> {let numbers = vec![27, 297, 38502, 81];numbers.into_iter().map(|n| divide(n, 27)).collect()
}
迭代器补充
- (1…=num)是迭代器
闭包
Rust 中常见的闭包函数有:
map:对迭代器每个元素应用闭包(返回迭代器)
let v = vec![1, 2, 3];let doubled: Vec<_> = v.iter().map(|x| x * 2).collect();
filter:用闭包筛选元素(返回迭代器)
let v = vec![1, 2, 3, 4];let even: Vec<_> = v.into_iter().filter(|x| x % 2 == 0).collect();
fold:用闭包累积结果(返回累积值)
let sum = (1..=4).fold(0, |acc, x| acc + x);
for_each:对每个元素执行闭包(不返回)
v.iter().for_each(|x| println!("{}", x));
find:用闭包查找元素(返回第一个查到元素的Some)
let first_even = v.iter().find(|&&x| x % 2 == 0);
这些都是迭代器常用的闭包用法。
Hashmap
filter() + count()计算指定元素值的个数
fn count_iterator(map: &HashMap<String, Progress>, value: Progress) -> usize {// map is a hashmap with String keys and Progress values.// map = { "variables1": Complete, "from_str": None, ... }map.values().filter(|&&x| x == value).count()
}
- 解释:map是对哈希表的引用。但也能调用values()返回对哈希表值的引用迭代器。
- filter()+count()是搜索哈希表中指定值的个数的经典用法。
- 闭包中有两层引用的原因是,map本身是引用,value又一层引用
合并迭代器
flat_map()
fn count_collection_iterator(collection: &[HashMap<String, Progress>], value: Progress) -> usize {// collection is a slice of hashmaps.// collection = [{ "variables1": Complete, "from_str": None, ... },// { "variables2": Complete, ... }, ... ]collection.iter().flat_map(|map| map.values()).filter(|&&x| x == value).count()
}
- flat_map是用来合并迭代器的
- flat.map是用来合并迭代器的,因此他的闭包函数只能是迭代器返回值。