2

采用以下数据类型:

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 标准库中的MapZip函数。

如何在不使用 for 循环的情况下获得相同的结果?

4

1 回答 1

2

如何在不使用 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,最佳选择有时取决于您和其他项目贡献者的编程背景。

于 2021-01-16T11:35:00.357 回答