/ PROGRAMMING, RUST

Rust - Control Flow

이 글에서는 Rust의 문법 중 Control Flow에 관련된 것들을 다뤄봅시다.

Rust 맛보기

반복문

Rust는 loop이라는 키워드로 반복문을 만들 수 있는데, C에서의 while(1)과 비슷한 역할을 합니다.

loop {
    println!("again!");
}

중요한 특징으로, 반복문을 탈출할 때 값을 리턴할 수 있다는 점이 있습니다.

let mut counter = 0;

let result = loop {
    counter += 1;

    if counter == 10 {
        break counter * 2;
    }
};

또한 다중 루프의 경우 각 루프에 라벨을 추가하여, break 시 원하는 라벨로 탈출할 수 있습니다.

'outer: for x in 0..10 {
    'inner: for y in 0..10 {
        if x == 5 && y == 5 {
            break 'outer; // 바로 바깥 루프 탈출
        }
    }
}

for 반복문

for 반복문은 iter() 메소드를 통해 반복할 수 있는 모든 타입에 대해 사용할 수 있습니다.

Python의 반복문과 용법이 비슷합니다.

let a = [10, 20, 30, 40, 50];

for element in a {
    println!("the value is: {}", element);
}

iter() 메소드는 iterator를 반환하는데, 이는 for 반복문에서 사용할 수 있는 타입입니다.

rev() 메소드는 역순으로 순회하는 iterator를 반환합니다.

참고로 위 소스 코드에서 a는 반복문 종료 이후 더 이상 접근이 불가능합니다. a소유권for 문 안으로 넘어갔고, 반복문이 종료되면 a는 drop되기 때문이죠.

if let을 사용한 패턴 매칭

match를 대체하는 기능을 하는 문법입니다.

let config_max = Some(3u8);
match config_max {
    Some(3) => println!("three"),
    _ => (),
}

위 코드를 if let을 사용하여 다음과 같이 간결하게 표현할 수 있습니다.

if let Some(3) = config_max {
    println!("three");
}

특이하게도 C로 치면 rvalueSome(3)let 다음에 오고 있습니다. 왜인지는 저도 잘 모릅니다. 공식 문서를 참조해야 할 것 같습니다.

여기에 else를 추가할 수도 있습니다.

let config_max = Some(3u8);
if let Some(3) = config_max {
    println!("three");
} else {
    println!("not three");
}

참고 문헌

Rust 맛보기