반응형
반복자
반복자는 일련의 아이템을 순서대로 처리할 수 있게 해준다.
let v1 = vec![1, 2, 3];
let v1_iter = v1.iter();
for val in v1_iter {
println!("Got: {}", val);
}
반복자를 사용해 for 루프가 호출되면, 반복자의 각 요소가 루프의 한 순번마다 사용된다.
Iterator 트레이트
모든 반복자는 표준 라이브러리의 Iterator 트레이트를 구현한다.
pub trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
}
type Item
과 Self::Item
은 이 트레이트의 연관 타입을 정의한다. 트레이트를 구현하려면 Item
타입도 함께 정의되어야 하고, Item
타입은 next
메서드의 반환 타입으로 사용된다.
next
를 호출하는 메서드는 consuming adaptor라 부른다. 호출하면 반복자를 소비하기 때문이다. sum
메서드는 반복자의 소유권을 가져온 후 next
를 반복적으로 호출하여 소비한다.
#[test]
fn iterator_sum() {
let v1 = vec![1, 2, 3];
let v1_iter = v1.iter();
let total: i32 = v1_iter.sum();
assert_eq!(total, 6);
}
Iterator adaptor는 반복자의 어떤 부분을 바꾸어 다른 반복자를 제공한다. map
은 수정된 아이템을 생성하는 새로운 반복자를 반환한다. 여기서는 클로저가 각 아이템에서 1을 증가한 새로운 반복자를 만든다.
let v1: Vec<i32> = vec![1, 2, 3];
v1.iter().map(|x| x + 1);
하지만 반복자가 소비되지 않았으므로, collect
메소드를 사용해 소비한다. 반복자를 소비하고 결괏값을 모아서 컬렉션 데이터 타입으로 만들어준다.
let v1: Vec<i32> = vec![1, 2, 3];
let v2: Vec<_> = v1.iter().map(|x| x + 1).collect();
assert_eq!(v2, vec![2, 3, 4]);
환경을 캡처하는 클로저
fn shoes_in_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> {
shoes.into_iter().filter(|s| s.size == shoe_size).collect()
}
filter
메서드의 클로저 인수는 반복자로부터 아이템을 받아서 bool을 반환한다. 클로저가 true이면 그 값을 반복자에 포함시킨다.
shoes.into_iter
를 호출해 벡터의 소유권을 갖는 반복자를 생성하고, filter
로 조건에 맞는 요소만 새 반복자에 담는다. 마지막으로 collect
로 반환된 값을 벡터로 모은다.
반응형
'프로그래밍 > Rust' 카테고리의 다른 글
[Rust] 스레드 (0) | 2024.05.19 |
---|---|
[Rust] 스마트 포인터 (0) | 2024.05.19 |
[Rust] 클로저 (0) | 2024.05.19 |
[Rust] 테스트 (0) | 2024.05.19 |
[Rust] 제네릭과 트레이트 (0) | 2024.05.19 |