Iterator Pipelines
Enumerate and Filter Map
Keep Matching Indexes
enumerate pairs each item with its index, and filter_map can keep only the indexes that match.
Program
Play the program to choose a status value and collect the matching positions.
enumerate_filter_map.rs
Replay: real traced execution (multi-file project)
fn main() {
let target = "open";
let statuses = ["open", "closed", "open"];
let indexes: Vec<usize> = statuses.iter().enumerate().filter_map(|(index, status)| if *status == target { Some(index) } else { None }).collect();
println!("{:?}", indexes);
}
fn main() {
let target = "closed";
let statuses = ["open", "closed", "open"];
let indexes: Vec<usize> = statuses.iter().enumerate().filter_map(|(index, status)| if *status == target { Some(index) } else { None }).collect();
println!("{:?}", indexes);
}
fn main() {
let target = "missing";
let statuses = ["open", "closed", "open"];
let indexes: Vec<usize> = statuses.iter().enumerate().filter_map(|(index, status)| if *status == target { Some(index) } else { None }).collect();
println!("{:?}", indexes);
}
target ← "open", statuses ← ["open", "closed", "open"], indexes ← [0, 2]
1fn main() {2 let targe→ "open"t = "open"; //@target="open", "closed", "missing"3 let statuse→ ["open", "closed", "open"]s = ["open", "closed", "open"];4 let indexe→ [0, 2]s: Vec<usize> = statuses.iter().enumerate().filter_map(|(index, status)| if *status == target { Some(index) } else { None }).collect();5 println!("{:?}", indexes);6}output[0, 2]
target ← "closed", statuses ← ["open", "closed", "open"], indexes ← [1]
1fn main() {2 let targe→ "closed"t = "closed";3 let statuse→ ["open", "closed", "open"]s = ["open", "closed", "open"];4 let indexe→ [1]s: Vec<usize> = statuses.iter().enumerate().filter_map(|(index, status)| if *status == target { Some(index) } else { None }).collect();5 println!("{:?}", indexes);6}output[1]
target ← "missing", statuses ← ["open", "closed", "open"], indexes ← []
1fn main() {2 let targe→ "missing"t = "missing";3 let statuse→ ["open", "closed", "open"]s = ["open", "closed", "open"];4 let indexe→ []s: Vec<usize> = statuses.iter().enumerate().filter_map(|(index, status)| if *status == target { Some(index) } else { None }).collect();5 println!("{:?}", indexes);6}output[]
enumerate
`enumerate` yields `(index, value)` pairs from the input iterator.
filter_map
`filter_map` drops `None` and unwraps `Some(index)` in one step.
positions
The collected vector stores matching positions rather than matching values.