다른언어의 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(),
_ => (),
}