gpt4 book ai didi

rust - 如何从嵌套迭代器中收集数据?

转载 作者:行者123 更新时间:2023-11-29 08:29:36 25 4
gpt4 key购买 nike

我正在尝试从嵌套迭代器中进行收集,但出现了 FromIterator not implemented 错误。这是一个例子:

#[derive(PartialEq)]
enum DayStatus {
Normal,
Abnormal,
}

struct Week {
days: Vec<Day>,
}

struct Day {
status: DayStatus,
}

struct Month {
weeks: Vec<Week>,
}

fn get_abnormal_days(month: Month) -> Vec<Day> {
// assume we have a month: Month which is filled
month
.weeks
.iter()
.map(|w| w.days.iter().filter(|d| d.status == DayStatus::Abnormal))
.collect()
}

fn main() {}

给我:

 error[E0277]: the trait bound `std::vec::Vec<Day>: std::iter::FromIterator<std::iter::Filter<std::slice::Iter<'_, Day>, [closure@src/main.rs:24:39: 24:74]>>` is not satisfied
--> src/main.rs:25:10
|
25 | .collect()
| ^^^^^^^ a collection of type `std::vec::Vec<Day>` cannot be built from an iterator over elements of type `std::iter::Filter<std::slice::Iter<'_, Day>, [closure@src/main.rs:24:39: 24:74]>`
|
= help: the trait `std::iter::FromIterator<std::iter::Filter<std::slice::Iter<'_, Day>, [closure@src/main.rs:24:39: 24:74]>>` is not implemented for `std::vec::Vec<Day>`

我可以尝试impl FromIterator 但它必须来自的类型似乎太内在而无法处理。我想我没有调用正确的 collectmap 但我看不到我遗漏了什么

我第一次尝试返回 &[Day] 但也失败了。

最佳答案

要取消嵌套迭代器,请使用 flat_map 而不是 map

此外,您需要使用 Copy 类型或使用 into_iter 来迭代拥有的值而不仅仅是引用。

工作示例:

#[derive(PartialEq)]
enum DayStatus {
Normal,
Abnormal,
}

struct Week {
days: Vec<Day>,
}

struct Day {
status: DayStatus,
}

struct Month {
weeks: Vec<Week>,
}

fn get_abnormal_days(month: Month) -> Vec<Day> {
// assume we have a month: Month which is filled
month
.weeks
.into_iter()
.flat_map(|w| {
w.days
.into_iter()
.filter(|d| d.status == DayStatus::Abnormal)
})
.collect()
}

fn main() {}

关于rust - 如何从嵌套迭代器中收集数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49966420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com