我正试图通过相关值过滤枚举向量:
在我的例子中,枚举是Item
,它有两种情况:
- 包含CCD_ 3结构的CCD_
- 以及包含CCD_ 5结构体的CCD_
我想用G
过滤Item
的Vec
,得到Group
的Vec
。简而言之:从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
(。
但是,它仍然在Item
s上生成迭代器,而不是在Group
s上。您需要G
0:
stuff
.iter()
.filter_map(|e| match e {
Item::G(group) => Some(group),
_ => None,
})
.for_each(|e| println!("{:#?}", e));