Rust(14) – match

다른언어의 switch 문을 대체하는 Rust 문법.

지난시간에 enum에 대해서 배웠는데, match를사용해 어떻게 분류하는지 알아봅니다.

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

fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => 1,
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter => 25,
    }
}

Rust는 이렇게 match를 사용할때 enum Coin의 모든 값을 다 cover 해야합니다. 하나라도 빼놓으면 에러가 나는데 컴파일러가 잡아주고, 어떤 값을 빼먹었는지도 친절하게 알려줍니다.

Catch-All 패턴과 _ Placeholder

enum – match 사용 시, 모든 케이스에대해 일일히 처리하고싶지 않은경우도 있습니다. 이럴때는 캐치올 패턴이나 _를 사용해서 처리할수있는데요. 아래코드를 보며 이해해봅시다.

let dice_roll = 9;
    match dice_roll {
        3 => add_fancy_hat(),
        7 => remove_fancy_hat(),
        other => move_player(other),
    }

    fn add_fancy_hat() {}
    fn remove_fancy_hat() {}
    fn move_player(num_spaces: u8) {}

위 코드에서는 3, 7 인경우 각 기능을 실행하고 그외의 숫자는 move_player 함수를 호출하면서 동시에 other값을 인수로 전달하는걸 볼수 있습니다. other은 Catch-All 키워드인데 이떄 이름은 사용자가 원하는대로 쓰면됩니다, other, others도 모두 사용가능하고 사용자가 원하는 이름으로 적으면됩니다 나머지값이라는 의미로 rest라고해도 되고 함수인자에 전달하는 값에 포인트를줘서 value라고해도됩니다.

또 다른 Catch-All 키워드로는 _ 언더스코어가 있는데 이것은 특별합니다. other 처럼 빼놓은 모든 fields를 커버해주지만 값은 사용하지않게됩니다. 아래처럼 그냥 특정함수를 실행할수도 있고, ()만 남겨서 아무것도 하지않을수도 있습니다.

match dice_roll {
    3 => add_fancy_hat(),
    7 => remove_fancy_hat(),
    _ => reroll(),
}

match dice_roll {
    3 => add_fancy_hat(),
    7 => remove_fancy_hat(),
    _ => (),
}

댓글 남기기