使用iter()和Filter()通过关联的枚举过滤枚举的向量



我正试图通过相关值过滤枚举向量:

在我的例子中,枚举是Item,它有两种情况:

  • 包含CCD_ 3结构的CCD_
  • 以及包含CCD_ 5结构体的CCD_

我想用G过滤ItemVec,得到GroupVec。简而言之:从Vec<Item>我想要Vec<Group>。我得到了这个错误:no field 0 on type &&Item(我试着放***(。

我做错什么了吗?

铁锈操场:https://play.rust-lang.org/?version=stable&mode=调试&edition=2021&gist=fd87bb6e80396d055653c438e894f41a

参考代码:

#[derive(Debug, PartialEq, Eq)]
enum Item {
G(Group),
S(MetaSegment)
}
#[derive(Debug, PartialEq, Eq)]
struct Group {}
#[derive(Debug, PartialEq, Eq)]
struct MetaSegment {}
fn main() {
let mut stuff = Vec::<Item>::new();

stuff.push(Item::G(Group{}));
stuff.push(Item::S(MetaSegment{}));
stuff.push(Item::G(Group{}));

stuff
.iter()
.filter(|e| matches!(e.0, Item::G(_)))
.for_each(|e| println!("'{:#?}'", e));
}

您需要使用matches!(e, Item::Group(_))(没有.0(。

但是,它仍然在Items上生成迭代器,而不是在Groups上。您需要G0:

stuff
.iter()
.filter_map(|e| match e {
Item::G(group) => Some(group),
_ => None,
})
.for_each(|e| println!("{:#?}", e));

最新更新