티스토리 뷰
match
match라는 제어문이 있다.
일련의 패턴에 대해 어떤 값을 비교한 뒤 어떤 패턴에 매치되었는지에 따라 코드를 제어한다.
match 표현식을 코인 분류기라고 생각했을 때 match를 이용하여 코인에 따른 번호를 return하는 코드이다.
pub fn run(){
let coin = Coin::BitCoin;
println!("{}",value_in_coin(coin));
}
enum Coin{
BitCoin,
Ethereum,
AltCoin,
Ripple
}
fn value_in_coin(coin: Coin) -> u32{
match coin{
Coin::BitCoin => 1,
Coin::Ethereum => 2,
Coin::AltCoin => 3,
Coin::Ripple => 4
}
}
match에는 어떤 키워드도 사용이 가능하다. 위의 경우 Coin타입을 가지는 coin이다.
match에 갈래(arm)이 있다. 하나의 갈래는 두 부분을 갖고 있다. "패턴=>결과"의 형태로 되어있다.
=>연산자는 반환할 값을 가리키고있다. 위의 코드에서는 1을 출력한다.
match 갈래의 패턴과 매치된 값들의 부분을 바인딩할 수 있다.
값들을 바인딩하는 패턴은 열거형 variant로 부터 어떤 값들을 추출할 수 있는 방법이다.
pub fn run(){
let bit_coin1 = Unit::BTC;
let bit_coin2 = Unit::KRW;
let coin1 = Coin::BitCoin(bit_coin1);
let coin2 = Coin::BitCoin(bit_coin2);
println!("{}",value_in_coin(coin1));
println!("{}",value_in_coin(coin2));
}
#[derive(Debug)]
enum Unit{
BTC,
KRW
}
enum Coin{
BitCoin(Unit),
Ethereum,
AltCoin,
Ripple
}
fn value_in_coin(coin: Coin) -> u32{
match coin{
Coin::BitCoin(unit) => {
println!("unit : {:?}", unit);
1
},
Coin::Ethereum => 2,
Coin::AltCoin => 3,
Coin::Ripple => 4
}
}
요런식으로 사용가능하다.
Option<T>를 사용하는 match
Option열거형에서 Some 케이스로부터 내부의 T값을 얻어야 했다.
Option<i32>를 parameter받아서 내부에 값이 있다면 그 값이 1을 더하고, 없다면 None을 반환하는 함수이다.
pub fn run(){
let five = Option::Some(5);
let six = plus_one(five);
let none = plus_one(Option::None);
println!("{:?}", six);
println!("{:?}", none);
}
#[derive(Debug)]
enum Option<T>{
Some(T),
None
}
fn plus_one(x: Option<i32>) -> Option<i32>{
match x{
Option::None => Option::None,
Option::Some(i) => Option::Some(i + 1)
}
}
match내에 어떠한 패턴이 빠져있으면 오류가 난다.
match 패턴에 Ripple이 없다. 그럴 경우 다음과 같은 오류가 난다.
어떠한 패턴을 잊고 작성하지 않았더라도 다음과 같이 오류구문을 통해 빠트린 내용을 알 수 있다.
enum Coin{
BitCoin(Unit),
Ethereum,
AltCoin,
Ripple
}
fn value_in_coin(coin: Coin) -> u32{
match coin{
Coin::BitCoin(unit) => {
println!("unit : {:?}", unit);
1
},
Coin::Ethereum => 2,
Coin::AltCoin => 3,
}
}
변경자(placeholder)
위의 경우처럼 빠뜨린 내용에 대한 오류도 있지만 의도도적으로 빠뜨려야 될 경우도 있다. 이런 경우는 다음과 같이 사용이 가능하다.
enum Coin{
BitCoin(Unit),
Ethereum,
AltCoin,
Ripple
}
fn value_in_coin(coin: Coin) -> u32{
match coin{
Coin::BitCoin(unit) => {
println!("unit : {:?}", unit);
1
},
Coin::Ethereum => 2,
Coin::AltCoin => 3,
_ => 4
}
}
_ 를 사용하여 명시되지 않은 다른 경우에 대한 처리를 할 수 있다
이러한 match 패턴은 C++의 match case default 패턴과 유사하다.
전체코드
pub fn run(){
//let coin = Coin::BitCoin;
//println!("{}",value_in_coin(coin));
let bit_coin1 = Unit::BTC;
let bit_coin2 = Unit::KRW;
let coin1 = Coin::BitCoin(bit_coin1);
let coin2 = Coin::BitCoin(bit_coin2);
println!("{}",value_in_coin(coin1));
println!("{}",value_in_coin(coin2));
println!("{}",value_in_coin(Coin::BitCoin(Unit::KRW)));
let five = Option::Some(5);
let six = plus_one(five);
let none = plus_one(Option::None);
println!("{:?}", six);
println!("{:?}", none);
}
#[derive(Debug)]
enum Unit{
BTC,
KRW
}
enum Coin{
BitCoin(Unit),
Ethereum,
AltCoin,
Ripple
}
fn value_in_coin(coin: Coin) -> u32{
match coin{
Coin::BitCoin(unit) => {
println!("unit : {:?}", unit);
1
},
Coin::Ethereum => 2,
Coin::AltCoin => 3,
_ => 4
}
}
#[derive(Debug)]
enum Option<T>{
Some(T),
None
}
fn plus_one(x: Option<i32>) -> Option<i32>{
match x{
Option::None => Option::None,
Option::Some(i) => Option::Some(i + 1)
}
}
match 흐름 제어 연산자 - The Rust Programming Language
러스트는 match라고 불리는 극도로 강력한 흐름 제어 연산자를 가지고 있는데 이는 우리에게 일련의 패턴에 대해 어떤 값을 비교한 뒤 어떤 패턴에 매치되었는지를 바탕으로 코드를 수행하도록
rinthel.github.io
'Rust-Language' 카테고리의 다른 글
collection - vector (0) | 2021.04.23 |
---|---|
if let 흐름 제어 (0) | 2021.04.13 |
열거형 (0) | 2021.04.09 |
method (0) | 2021.04.07 |
구조체 (0) | 2021.04.07 |