이제 보상: 열 줄짜리 명령형 루프를 한 선언적 체인으로 바꾸는 이터레이터 어휘. 손에 익으면 매일 손 뻗을 패턴들이야.
collect: 컬렉션 짓기
collect 는 이터레이터를 컬렉션으로 소비해 — Vec, String, HashMap, 네가 표기하는 뭐든. '이 파이프라인을 데이터로 되돌리기' 의 보편 연산이야. 바인딩의 타입 표기, 또는 turbofish collect::<Vec<_>>() 가 뭘 지을지 말해.
enumerate, zip, chain
enumerate 는 각 항목을 인덱스와 짝지어 — 수동 카운터 없이 인덱스를 얻는 옳은 법. zip 은 두 이터레이터를 보조 맞춰 짝으로 걷고. chain 은 두 이터레이터를 끝과 끝으로 이어. 같이 쓰면 까다로운 인덱스 조작 한 부류를 통째로 대체해.
let mut i = 0; for x in &v { ...; i += 1; } 대신 for (i, x) in v.iter().enumerate() 라 써. 증가 까먹을 카운터도, off-by-one 도 없고, 의도가 명시적이야. clippy 가 제안하는 제일 흔한 이터레이터 정리야.fold: 일반 reducer
fold(초깃값, |acc, item| ...) 는 모든 원소에 accumulator 를 꿰어 — 합, 곱, 문자열 짓기, 최댓값 계산이 다 fold 야. 특화 consumer 가 안 맞으면 fold 가 일반 도구야. 이걸 이해하면 거의 모든 집계를 한 표현식으로 표현할 수 있어.
이게 관용적 Rust 야
수동 루프 전에 이터레이터 체인으로 손 뻗는 게 유창한 Rust 의 제일 또렷한 표식 중 하나야. 체인은 선언적이고, 버그에 강하고 (인덱스 계산 없음), zero-cost 야. let mut result = vec![]; for ... { result.push(...) } 를 쓰고 있는 자신을 잡으면, map+collect 가 더 명확히 말하는지 물어봐.