Rust 반복자

mohadang·2023년 1월 22일
0

Rust

목록 보기
11/30
post-thumbnail

소비 어댑터

모든 반복자는 지연 특성이 있으므로 반복자 어댑터를 호출한 후의 결과를 얻으려면 소비 어댑터 메서드 중 하나를 호출해야 한다.

각 아이템에 대해 인수로 전달된 클로저를 호출하는 반복자 어댑터 메서드인 map 메서드의 사용법

fn run_test1(test_case: &[i32]) {
    // 반복자 어댑터만 호출하고 소비 어댑터는 호출되지 않아서 아무런 작업도 수행하지 않는다.
    test_case.iter().map(|x| x + 1);
}

fn run_test2(test_case: &[i32]) {
     // 반복자 어댑터 map이 for문 안이라서 소비된다.     
    for item in test_case.iter().map(|x| x + 1) {
        println!("{}", item);
    }
}
fn run_test3(test_case: &[i32]) {
    // 소비자 어댑터인 collect를 호출하기에 계산된 결과를 반환한다.
    let v: Vec<_> = test_case.iter().map(|x| x + 1).collect();
    assert_eq!(v, vec![2, 3, 4]);
}

fn main() {
    run_test1(&[1, 2, 3]);
    run_test2(&[1, 2, 3]);
    run_test3(&[1, 2, 3]);
}

for 소유권 이동

for문 자체가 소유권을 가져오는 특성이 있어 주의가 필요하다.

fn main() {
    let aa = vec![1, 2, 3];
    for item in aa {
        println!("{}", item);
    }
    for item in aa { // error, 소유권 이동
        println!("{}", item);
    }    
}

만약 for문에 소유권을 전달하고 싶지 않다면 참조로 전달 해야한다.

fn main() {
    let aa = vec![1, 2, 3];
    for item in &aa { // 참조
        println!("{}", item);
    }
    for item in aa { // OK
        println!("{}", item);
    }    
}

zip

zip 메서드는 두개의 컨테이너를 바인딩 해준다.

fn main() {
    for (x, y) in (0..10).zip(5..10) {
        println!("{}, {}", x, y);
    }
}
0, 5
1, 6
2, 7
3, 8
4, 9

중첩 반복문에서 break

중첩되어 있는 반복문에서 모두 탈출하기 위해 더 이상 flag 변소를 만들 필요가 없다
레이블을 사용하여 탈출할 for문을 지정할 수 있다.(goto 문 비슷)

fn main() {
    'outer: for x in 0.. {
        for y in 0.. {
            for z in 0.. {
                println!("{}, {}, {}", x, y, z);
                if x + y + z > 5 {
                    break 'outer;
                }
            }
        }
    }
}
profile
mohadang

0개의 댓글