Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 18 additions & 15 deletions src/fn/closures/closure_examples/iter_find.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,27 @@ fn main() {
let vec1 = vec![1, 2, 3];
let vec2 = vec![4, 5, 6];

// `iter()` for vecs yields `&i32`.
// `vec1.iter()` yields `&i32`.
let mut iter = vec1.iter();
// `into_iter()` for vecs yields `i32`.
// `vec2.into_iter()` yields `i32`.
let mut into_iter = vec2.into_iter();

// `iter()` for vecs yields `&i32`, and we want to reference one of its
// items, so we have to destructure `&&i32` to `i32`
println!("Find 2 in vec1: {:?}", iter .find(|&&x| x == 2));
// `into_iter()` for vecs yields `i32`, and we want to reference one of
// its items, so we have to destructure `&i32` to `i32`
println!("Find 2 in vec2: {:?}", into_iter.find(| &x| x == 2));
// `iter()` yields `&i32`, and `find` passes `&Item` to the predicate.
// Since `Item = &i32`, the closure argument has type `&&i32`,
// which we pattern-match to dereference down to `i32`.
println!("Find 2 in vec1: {:?}", iter.find(|&&x| x == 2));

// `into_iter()` yields `i32`, and `find` passes `&Item` to the predicate.
// Since `Item = i32`, the closure argument has type `&i32`,
// which we pattern-match to dereference down to `i32`.
println!("Find 2 in vec2: {:?}", into_iter.find(|&x| x == 2));

let array1 = [1, 2, 3];
let array2 = [4, 5, 6];

// `iter()` for arrays yields `&&i32`
println!("Find 2 in array1: {:?}", array1.iter() .find(|&&x| x == 2));
// `into_iter()` for arrays yields `&i32`
// `array1.iter()` yields `&i32`
println!("Find 2 in array1: {:?}", array1.iter().find(|&&x| x == 2));
// `array2.into_iter()` yields `i32`
println!("Find 2 in array2: {:?}", array2.into_iter().find(|&x| x == 2));
}
```
Expand All @@ -53,13 +56,13 @@ item, use `Iterator::position`.
fn main() {
let vec = vec![1, 9, 3, 3, 13, 2];

// `iter()` for vecs yields `&i32` and `position()` does not take a reference, so
// we have to destructure `&i32` to `i32`
// `position` passes the iterator’s `Item` by value to the predicate.
// `vec.iter()` yields `&i32`, so the predicate receives `&i32`,
// which we pattern-match to dereference to `i32`.
let index_of_first_even_number = vec.iter().position(|&x| x % 2 == 0);
assert_eq!(index_of_first_even_number, Some(5));

// `into_iter()` for vecs yields `i32` and `position()` does not take a reference, so
// we do not have to destructure
// `vec.into_iter()` yields `i32`, so the predicate receives `i32` directly.
let index_of_first_negative_number = vec.into_iter().position(|x| x < 0);
assert_eq!(index_of_first_negative_number, None);
}
Expand Down