이번 편의 목표: 연체 일수 목록에서 0보다 큰 날만 골라 하루 100원을 곱하고 합칩니다.

반복자는 다음 값을 하나씩 꺼내는 인터페이스입니다. iter는 벡터를 빌리는 반복자이고, copied는 &i32를 i32로 복사합니다. filter와 map에 넘기는 |day| 식이 클로저입니다. 짧은 함수를 값처럼 그 자리에 적습니다.

Rust
fn main() {
    let days = vec![0, 2, 4];
    let total: i32 = days
        .iter()
        .copied()
        .filter(|day| *day > 0)
        .map(|day| day * 100)
        .sum();
    println!("{total}");
}

0은 걸러지고 2와 4만 남습니다. 200과 400의 합이라 출력은 600입니다. sum의 결과 타입을 : i32로 적으면 어떤 정수를 더하는지 분명해집니다. filter의 day는 &i32이므로 *day로 비교합니다. map에 들어갈 때는 이미 i32입니다.

클로저는 바깥 변수를 빌리거나 가져갈 수 있습니다. 이 편의 클로저는 인자만 쓰므로 바깥 값을 잡지 않습니다. for로 적은 10편의 합계와 결과는 같고, 거르는 일과 곱하는 일과 더하는 일이 순서로 분리됩니다.

직접 해 보기

목록을 1, 0, 5로 바꿔 합계가 600인지 확인하세요.

해설

1과 5만 남습니다. 100과 500의 합은 600입니다. 0을 거르는 조건은 그대로 둡니다.