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.

target
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);
}
  1. 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]
  1. 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]
  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.