[Rust]

[Rust] match 연산자

극꼼 2023. 8. 15. 00:15
반응형


<match>

: 흐름 제어 연산자로, 일련의 패턴에 대해 어떤 값을 비교한 뒤 어떤 패턴에 매치되었는지를 바탕으로 코드를 수행하게 해줍니다. match의 힘은 패턴의 표현성으로부터 오며, 컴파일러는 모든 가능한 경우가 다루어지는지를 검사합니다.

 

다음은 코인의 종류를 enum으로 표현하고, 코인을 센트로 변환해주는 함수입니다. match에서의 각각 나뉘는 갈래를 arm이라 합니다.

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
    None,
}

fn value_in_cents(coin: Coin) -> u32 {
    match coin {
        Coin::Penny => 1,
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter => 25,
        Coin::None => {
            println!("No coin");
        }
    }
}

 

만약 value_in_cents 함수에서 Coin의 모든 variants에 대응해주지 않는다면 error[E0308]: mismatched types 에러가 출력될 것입니다. 


<값을 바인딩하는 패턴들>

match 갈래에서 매치된 값의 부분을 바인딩할 수 있는데요, 이걸로 열거형 variant로부터 어떤 값을 추출해낼 수 있습니다.

다음은 예시 코드입니다. Coin2 열거형의 Quarter variant가 UsState의 값을 들고 있습니다. 

#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
    // ... etc
}

enum Coin2 {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

value_in_cents 함수에서 Coin::Quarter가 매치될 때 state 변수에는 해당 쿼터 동전의 주에 대한 값이 바인딩됩니다. 이 때 예시코드에서 println!을 한 것처럼  variant로부터 값을 추출할 수 있습니다.

fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => 1,
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter(state) => {
            println!("State quarter from {:?}!", state);
            25
        }
    }
}

<Option<T> 매칭>

plus_one 함수는 Option<i32>를 매개변수로 받고, None일 때는 None을 리턴하고 Some<T>일 때 1을 더해서 리턴해줍니다. 이 때 match는 모든 케이스를 다루는 것을 강제하기 때문에 None 또는 Some(i) 둘 중 하나만 빠져도 컴파일 에러를 일으킵니다 : error[E0004]: non-exhaustive patterns

fn plus_one(x: Option<i32>) -> Option<i32> {
    match x {
        None => None,
        Some(i) => Some(i + 1),
    }
}

 

<포괄 패턴>

other 또는 _는 나열한 값들 외의 값들에 대해 기본 동작을 취하도록 합니다.

let dice_roll = 6;
match dice_roll {
    3 => {
        println!("three");
    },
    4 => {
        println!("four");
    },
    other => {
        println!("{}", other + 1); // 7 출력
    },
    // other 대신 이렇게도 가능합니다.
    //_ => {
    //    println!("other!"); // other! 출력
    //},
}

요약한 참조 링크 : https://rinthel.github.io/rust-lang-book-ko/ch06-02-match.html

반응형

'[Rust]' 카테고리의 다른 글

[Rust] 제네릭 타입  (0) 2023.08.17
[Rust] 에러 처리  (0) 2023.08.16
[Rust] 컬렉션(Collection)  (0) 2023.08.14
[Rust] 패키지, 크레이트, 모듈로 프로젝트 관리  (0) 2023.08.11
[Rust] 열거형(enum)  (0) 2023.08.01