In this below example (here is the Rust playground), I need to filter values in an iterator that match a specific pattern.
One way I found is to use a match
returning an Option
in filter_map
:
#[derive(Copy, Clone, Debug)]
struct Entity(i32);
enum Event {
EntityInserted(Entity),
EntityRemoved(Entity),
}
fn main() {
let [entity1, entity2] = [Entity(1), Entity(2)];
let events = vec![
Event::EntityInserted(entity1),
Event::EntityRemoved(entity1),
Event::EntityInserted(entity2),
];
let inserted_entities: Vec<_> = events
.iter()
.filter_map(|event| match event { // <---
Event::EntityInserted(entity) => Some(entity), // <--- Those lines
_ => None, // <--- here
}) // <---
.collect();
dbg!(inserted_entities);
}
Is there a more idiomatic way to have this behavior ?