match 흐름 제어 연산자
match
는 패턴을 이용해 패턴에 매칭된 경우, 실행될 코드를 작성할 수 있게 해준다.- 동전 분류기에서 동전을 작은 구멍부터 넣어보아 크기에 알맞은 구멍으로 쏙 들어가게 하는 것과 같다.
- 여기서 좋은 점은 놓치는
variant
가 없다는 것이다.
- 여기서 좋은 점은 놓치는
예제 1: variants
별로 처리하기
enum Coin {
Penny,
Nickel,
Dime,
Quarter,
}
fn value_in_cents(coin: Coin) -> u32 {
match coin {
Coin::Penny => {
println!("Lucky penny!");
1
},
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter => 25,
}
}
variants
하나마다 반환할 값을 정할 수 있다.- 블록을 만들어 특정한 로직을 수행하고 값을 반환할 수도 있다.
예제 2: 열거형을 사용하는 열거형 이용하기
#[derive(Debug)] // So we can inspect the state in a minute
enum UsState {
Alabama,
Alaska,
// ... etc
}
enum Coin {
Penny,
Nickel,
Dime,
Quarter(UsState),
}
fn value_in_cents(coin: Coin) -> u32 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter(state) => {
println!("State quarter from {:?}!", state);
25
},
}
}
- 구조체를 받는 열거형
variant
가 존재한다면, 위와 같은 문법으로 처리가 가능하다.
#[derive(Debug)]
는 구조체를 'printable' 하게 만든다. 자바에서toString()
메서드를 자동으로 오버라이드하는 것과 비슷한 기능을 가지고 있다. 구조체를 출력할 때 내부의 값이 출력되도록 한다.
출력되는 방식을 수정하고 싶다면,fmt::Display
를 통해 가능하다.
코드 실행 결과보기
fn main() {
let value_result = value_in_cents(Coin::Quarter(UsState::Alaska));
print!("value result: {}", value_result);
}
State quarter from Alaska!
value result: 25
예제 3: match
를 통해 Option<T>
를 깔끔하게 처리하기
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
None => None,
Some(i) => Some(i + 1),
}
}
let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);
Option<T>
역시 열거형임을 생각해보면,match
를 사용할 수 있다는 사실을 알 수 있다.match
를 통한Option<T>
처리는 혹시나 실수로 작성하지 않고 넘어갈 수 있는null
에 대한 경우의 수를 놓치지 않고 처리하도록 도와준다.
틀린 예제: match
가 모든 열거형 variants
를 다루지 않을 때
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
Some(i) => Some(i + 1),
}
}
error[E0004]: non-exhaustive patterns: `None` not covered
-->
|
6 | match x {
| ^ pattern `None` not covered
None
일지도 모르는 값이 그대로None
이 되어 에러를 유발하게 하지 않는다.
_
변경자 (placeholder) 의 사용
let some_u8_value = 0u8;
match some_u8_value {
1 => println!("one"),
3 => println!("three"),
5 => println!("five"),
7 => println!("seven"),
_ => (),
}
0u8
은 0 ~ 255 까지 유효한 값을 가질 수 있다.
_
는 모든 값과 매칭된다.- 굳이 처리하고 싶지 않은 값이 있는 경우 유용하다.
- 혹은 내가 원하는 범위 외의 값은 모두 예외로 처리하고 싶을 때도 유용할 것이다.
반응형
'러스트 (Rust)' 카테고리의 다른 글
러스트 (Rust) 열거형 3 - if-let 키워드 (0) | 2022.12.03 |
---|---|
러스트 (Rust) 열거형 1 - 기본 문법 (1) | 2022.12.03 |
러스트 (Rust) 메서드 (Method) 문법 (0) | 2022.11.03 |
러스트 (Rust) 구조체를 이용한 리팩토링 연습 (0) | 2022.11.03 |
러스트 (Rust) 구조체 정의하고 생성하는 방법 (0) | 2022.11.03 |