diff --git a/src/error/iter_result.md b/src/error/iter_result.md index 3b03090d5d..e77e21ff6f 100644 --- a/src/error/iter_result.md +++ b/src/error/iter_result.md @@ -30,6 +30,25 @@ fn main() { } ``` +## Collect the failed items with `map_err()` and `filter_map()` + +`map_err` calls a function with the error, so by adding that to the previous +`filter_map` solution we can save them off to the side while iterating. + +```rust,editable +fn main() { + let strings = vec!["42", "tofu", "93", "999", "18"]; + let mut errors = vec![]; + let numbers: Vec<_> = strings + .into_iter() + .map(|s| s.parse::()) + .filter_map(|r| r.map_err(|e| errors.push(e)).ok()) + .collect(); + println!("Numbers: {:?}", numbers); + println!("Errors: {:?}", errors); +} +``` + ## Fail the entire operation with `collect()` `Result` implements `FromIter` so that a vector of results (`Vec>`)