Iterator::any
Iterator::any는 이터레이터가 주어졌을 때, 어떤 요소라도 서술어(predicate)를 만족하면 true를 반환하는 함수입니다. 그렇지 않으면 false를 반환합니다. 시그니처는 다음과 같습니다:
pub trait Iterator {
// 반복되는 요소의 타입.
type Item;
// `any`는 `&mut self`를 취하므로 호출자는 빌려지거나
// 수정될 수 있지만, 소비(consume)되지는 않습니다.
fn any<F>(&mut self, f: F) -> bool where
// `FnMut`는 캡처된 변수가 최대 수정될 수 있지만 소비되지는 않음을 의미합니다.
// `Self::Item`은 클로저 파라미터 타입으로, 이터레이터에 의해 결정됩니다
// (예: `.iter()`의 경우 `&T`, `.into_iter()`의 경우 `T`).
F: FnMut(Self::Item) -> bool;
}
fn main() {
let vec1 = vec![1, 2, 3];
let vec2 = vec![4, 5, 6];
// 벡터에 대한 `iter()`는 `&i32`를 생성합니다. `i32`로 구조 분해합니다.
println!("vec1에 2가 있음: {}", vec1.iter() .any(|&x| x == 2));
// 벡터에 대한 `into_iter()`는 `i32`를 생성합니다. 구조 분해가 필요 없습니다.
println!("vec2에 2가 있음: {}", vec2.into_iter().any(|x| x == 2));
// `iter()`는 오직 `vec1`과 그 요소들을 빌리기만 하므로, 다시 사용할 수 있습니다.
println!("vec1 길이: {}", vec1.len());
println!("vec1의 첫 번째 요소: {}", vec1[0]);
// `into_iter()`는 `vec2`와 그 요소들을 이동(move)시키므로, 다시 사용할 수 없습니다.
// println!("vec2의 첫 번째 요소: {}", vec2[0]);
// println!("vec2 길이: {}", vec2.len());
// TODO: 위의 두 줄의 주석을 해제하고 컴파일 에러를 확인해 보세요.
let array1 = [1, 2, 3];
let array2 = [4, 5, 6];
// 배열에 대한 `iter()`는 `&i32`를 생성합니다.
println!("array1에 2가 있음: {}", array1.iter() .any(|&x| x == 2));
// 배열에 대한 `into_iter()`는 `i32`를 생성합니다.
println!("array2에 2가 있음: {}", array2.into_iter().any(|x| x == 2));
}