C.W.K.
Stream
Lesson 06 of 06 · published

실전 이터레이터 체인

~11 min · collections, iterators, collect, fold

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

이제 보상: 열 줄짜리 명령형 루프를 한 선언적 체인으로 바꾸는 이터레이터 어휘. 손에 익으면 매일 손 뻗을 패턴들이야.

collect: 컬렉션 짓기

collect 는 이터레이터를 컬렉션으로 소비해 — Vec, String, HashMap, 네가 표기하는 뭐든. '이 파이프라인을 데이터로 되돌리기' 의 보편 연산이야. 바인딩의 타입 표기, 또는 turbofish collect::<Vec<_>>() 가 뭘 지을지 말해.

enumerate, zip, chain

enumerate 는 각 항목을 인덱스와 짝지어 — 수동 카운터 없이 인덱스를 얻는 옳은 법. zip 은 두 이터레이터를 보조 맞춰 짝으로 걷고. chain 은 두 이터레이터를 끝과 끝으로 이어. 같이 쓰면 까다로운 인덱스 조작 한 부류를 통째로 대체해.

enumerate 가 수동 인덱스 카운터를 이겨. 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 가 더 명확히 말하는지 물어봐.

Code

enumerate, map 으로 collect, fold·rust
use std::collections::HashMap;

fn main() {
    let words = ["apple", "banana", "cherry"];

    // enumerate: 수동 카운터 없이 인덱스
    for (i, w) in words.iter().enumerate() {
        println!("{i}: {w}");
    }

    // word -> 길이 HashMap 으로 collect
    let lengths: HashMap<&str, usize> =
        words.iter().map(|&w| (w, w.len())).collect();
    println!("{:?}", lengths.get("banana")); // Some(6)

    // fold: 범용 누적
    let total_len = words.iter().fold(0, |acc, w| acc + w.len());
    println!("{total_len}"); // 17
}

External links

Exercise

Vec — 이름이랑 나이 — 가 주어지면, zip 으로 짝짓고, filter 로 성인 (나이 >= 18) 을 유지하고, Vec<(String, u32)> (또는 HashMap) 으로 collect 해. 그다음 길이-합 루프를 단일 fold 로 다시 써. 네 과거 코드의 어떤 루프가 체인 하나일 수 있었어?
Hint
names.iter().zip(ages.iter()).filter(|(_, &age)| age >= 18).collect() 가 join 이랑 filter 를 한 표현식에 해. fold 는 하나의-값으로-누적하는 어떤 루프든 일반화해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.