Rust iterator 소비

Iterator adapter와 consumer 소유권 흐름

반복자는 map과 filter를 붙이는 순간 실행되지 않는다. iter, iter_mut, into_iter가 빌림과 소유권을 어떻게 넘기고, collect나 for가 언제 소비하는지까지 봐야 한다.

01

반복 원천

컬렉션을 빌릴지, 가변으로 바꿀지, 소유권째 넘길지 먼저 결정한다.

API 선택 기준
02

Adapter 연결

map, filter, take 같은 adapter는 새 iterator를 만들 뿐 즉시 계산하지 않는다.

lazy
03

Consumer 실행

collect, sum, count, for, next가 호출될 때 실제 순회가 진행된다.

여기서 비용 발생
04

소비 후 상태

into_iter로 이동한 값은 다시 사용할 수 없고, next는 iterator 내부 위치를 전진시킨다.

부분 소비 한계
iter()
&T 항목 생성 원본 컬렉션을 유지한 채 읽기 전용으로 순회한다.
원본 재사용 가능
iter_mut()
&mut T 항목 생성 항목을 수정할 수 있지만 동시에 다른 빌림과 충돌할 수 있다.
단일 가변 빌림
into_iter()
T 또는 소유 항목 생성 컬렉션을 소비해 항목 소유권을 넘기는 경우가 많다.
이후 원본 사용 불가
collect()
구체 컬렉션으로 수집 타입 추론이 부족하면 Vec<_>처럼 목표 타입을 알려야 한다.
소비자 역할

filter 참조 · 부분 소비 · 성능 점검

filter 참조 filter closure는 항목 참조를 한 번 더 받을 수 있어 패턴의 & 개수를 확인한다.
부분 소비 next를 먼저 호출하면 이후 collect에는 남은 항목만 들어간다.
성능 iterator chain은 최적화될 수 있지만 allocation이 생기는 collect 위치를 확인한다.

소비 시점 메모

let it = nums.iter().map(|x| x + 1); // no work yet
let v: Vec<_> = it.collect();          // iteration happens