티스토리 뷰

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)
    }
}

 

참고 : rinthel.github.io/rust-lang-book-ko/ch06-02-match.html#%EA%B0%92%EB%93%A4%EC%9D%84-%EB%B0%94%EC%9D%B8%EB%94%A9%ED%95%98%EB%8A%94-%ED%8C%A8%ED%84%B4%EB%93%A4

 

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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함