采取以下数据类型:
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和Zip函数。
在不使用for循环的情况下如何获得相同的结果?
在不使用for循环的情况下如何获得相同的结果?
您可以使用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,最好的选择有时取决于您和其他项目贡献者的编程背景。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句