如何在没有 for 循环的元组 Vec 中转换两个嵌套的 HashMap?
How to turn two nested HashMaps in a Vec of tuples without for loops?
采用以下数据类型:
let mut items = HashMap::<u64, HashMap<u64, bool>>::new();
我成功地将它变成了这样的元组向量:
let mut vector_of_tuples: Vec<(u64, u64, bool)> = vec![];
for (outer_id, inner_hash_map) in items.iter() {
for (inner_id, state) in inner_hash_map.iter() {
vector_of_tuples.push((*outer_id, *inner_id, *state));
}
}
但我想缩小这段代码逻辑,可能借助于 Rust 标准库中的 Map and Zip 函数。
如何在不使用 for 循环的情况下获得相同的结果?
How can I achieve the same result without using for loops?
您可以使用 collect()
从没有显式循环的迭代器构建向量:
let vector_of_tuples: Vec<(u64, u64, bool)> = items
.iter()
// ...
.collect();
要将内部散列映射的内容扩展到迭代器中,可以使用flat_map
:
let vector_of_tuples: Vec<_> = items
.iter()
.flat_map(|(&outer_id, inner_hash_map)| {
inner_hash_map
.iter()
.map(move |(&inner_id, &state)| (outer_id, inner_id, state))
})
.collect();
在许多情况下,链接迭代器适配器会产生比等效的 for
循环更易于理解的代码,因为迭代器是以声明式风格编写的,并且往往不需要副作用。但是,在这种特殊情况下,原始 for
循环实际上可能是更具可读性的选项。 YMMV,最佳选择有时取决于您和其他项目贡献者的编程背景。
采用以下数据类型:
let mut items = HashMap::<u64, HashMap<u64, bool>>::new();
我成功地将它变成了这样的元组向量:
let mut vector_of_tuples: Vec<(u64, u64, bool)> = vec![];
for (outer_id, inner_hash_map) in items.iter() {
for (inner_id, state) in inner_hash_map.iter() {
vector_of_tuples.push((*outer_id, *inner_id, *state));
}
}
但我想缩小这段代码逻辑,可能借助于 Rust 标准库中的 Map and Zip 函数。
如何在不使用 for 循环的情况下获得相同的结果?
How can I achieve the same result without using for loops?
您可以使用 collect()
从没有显式循环的迭代器构建向量:
let vector_of_tuples: Vec<(u64, u64, bool)> = items
.iter()
// ...
.collect();
要将内部散列映射的内容扩展到迭代器中,可以使用flat_map
:
let vector_of_tuples: Vec<_> = items
.iter()
.flat_map(|(&outer_id, inner_hash_map)| {
inner_hash_map
.iter()
.map(move |(&inner_id, &state)| (outer_id, inner_id, state))
})
.collect();
在许多情况下,链接迭代器适配器会产生比等效的 for
循环更易于理解的代码,因为迭代器是以声明式风格编写的,并且往往不需要副作用。但是,在这种特殊情况下,原始 for
循环实际上可能是更具可读性的选项。 YMMV,最佳选择有时取决于您和其他项目贡献者的编程背景。