Examples in std, standard Lib 에 존재하는 예제
Iterator::any, iter에 있는 any라는 함수에 대해
any라는 함수는 해당 iter 객체에서 나온 element 가 예상한 어떤 value 값과 비교하여 맞으면 true 아니면 false 를 반환하는 함수이다.
std::lib 에서는 어떻게 구현했는지 알아보자.
//std::lib 에 구현된 iter trait pub trait Iterator { //해당 iter의 type 을 item 이라 지정한다. type Item; //any 함수는 자신을 파라미터로 받고 클로져도 파라미터로 받는다. return 값은 bool type. fn any<F>(&mut self, f: F) -> bool where // 클로져에 대한 타입과 return 값으 지정한다. 클로저 파라미터 또한 해당 iter 객체의 // 아이템인 것을 알 수 있다. 왜 이렇게 하는가? F: FnMut(Self::Item) -> bool; } fn main() { let any_test = vec![1, 2, 3, 4, 5]; // iter 로 변환할 수 있는데 Vec 타입의 변수를 구현하고 // any 함수를 호출한다. 이때 any 함수는 파라미터로 자기 자신과 클로져를 받는다는 것을 알 수있다. // 호출할 때 자기 자신이 파라미터로 포함되었다. 그럼 클로져만 파라미터로 넣으면 된다. // || 를 사용하여 파라미터를 클로져를 구현하고 뒤에 리턴 값인 bool type 이 나올 수 있게 식을 // 구현한다. let answer = any_test.iter().any(|&x| x == 2); println!("{answer}"); }
Iterator::find, iter에 있는 find 라는 함수에 대해
trait Iterator { //해당 iter의 type 을 item 이라 지정한다. type Item; fn find<P>(&mut self, p: P) -> Option<Self::Item> where //find function 의 클로져는 iter 의 아이템을 & 로 받음. P: FnMut(&Self::Item) -> bool; fn any<F>(&mut self, f: F) -> bool where //any function 의 클로져는 iter 의 아이템을 & 없이 받음. F: FnMut(Self::Item) -> bool; } fn main() { let string_list = vec!["hi".to_string(), "bye".to_string()]; //iter 를 통해 |x| 는 &string 이 된다 let answer_any = string_list.iter().any(|x| x == "hi" ); println!("{}", answer_any); let str_list = vec!["hi", "bye"]; // iter 를 통해 |x| &&str 가 되고 == str에 &를 붙이면 && 가 되므로 비교 가능 let str = str_list.iter().any(|x| x == &"hi"); println!("{}", str); let num_list = vec![1,2,3,4,5]; // iter 를 통해 |x| &i32 가 되고 == i32 에 &를 붙이면 &i32 == &i32 되므로 비교 가능 let num = num_list.iter().any(|x| x == &3); println!("{}", num); // find fn 는 &를 추가한 item 값을 받는데 이유는 return 해야하기 때문이다. // &&string 이 되므로 == &&str 이랑 비교한다. let answer_find = string_list.iter().find(|&x| x == &"hi"); println!("{:?}", answer_find); let str_list = vec!["hi", "bye"]; //iter() 를 통해 &str 가 되고 find 는 &를 추가한 item 을 받기에 &x 추가한다. let find_str_list = str_list.iter().find(|&x| x == &"hi"); println!("find_str_list : {:?}", find_str_list); let fin_num_list = num_list.iter().find(|&x| x == &3); // iter 을 통해 |x| 값은 각 각 &String, &&str, &i32 가 된다. // &str 와 i32 는 Copy type 이다. &x pattern 에 의해 destruct 된다. }