시뻘건 개발 도전기

러스트 16 - 열거형 #2 본문

프로그래밍/RUST

러스트 16 - 열거형 #2

시뻘건볼때기 2019. 3. 24. 22:26
반응형



"match"라고 하는 흐름 제어 연산자가 있다.

match 표현식은 열거형과 함께 사용되는 경우, 열거형 variants에 따라 다른 코드가 실행되며 해당 코드는 일치하는 값 내부의 데이터를 사용할 수 있다.

(쉽게 이해하면 마치 패턴 매칭...?)



fn main() {

    enum Coin {

        Penny,

        Nickel,

        Dime,

        Quarter,

    }


    fn value_in_cents(coin: Coin) -> u32 {

        // match 표현식

        match coin {

            // arms

            // {표현식} => value

            Coin::Penny => 1,

            Coin::Nickel => 5,

            Coin::Dime => 10,

            Coin::Quarter => 25,

        }

    }

}


match 표현식의 예를 보면 coin이라는 match가 존재 하고 그 안에 arms들이 나열되어 있으며 arms의 포맷은 "표현식 => value"형태다.

이 표현식이 실행될 때, 결과 값을 각 arms의 패턴과 순서대로 비교한다. 패턴이 값과 매치가 되면, 그 패턴과 연관되어 있는 코드가 실행된다. 반대로 매치가 안되면, 다음 arm으로 계속 된다. arm의 개수는 필요한 만큼.(제한이 없는 것 같다.)


솔직히 아직 이해가 안된다. 각 arm들을 가지고 패턴을 매치 시킨다는 것은 알겠는데....

다음 코드를 보면 바로 알 수 있다.


fn main() {

    enum Coin {

        Penny,

        Nickel,

        Dime,

        Quarter,

    }


    fn value_in_cents(coin: Coin) -> u32 {

        match coin {

            Coin::Penny => {

                println!("penny");

                1

            },

            Coin::Nickel => {

                println!("nickel");

                2

            },

            Coin::Dime => {

                println!("dime");

                3

            },

            Coin::Quarter => {

                println!("quarter");

                4

            },

        }

    }


    let penny = value_in_cents(Coin::Penny);

    let nickel = value_in_cents(Coin::Nickel);

    let dime = value_in_cents(Coin::Dime);

    let quarter = value_in_cents(Coin::Quarter);

    println!("=====================================");

    println!("penny : {}", penny);

    println!("nickel : {}", nickel);

    println!("dime : {}", dime);

    println!("quarter : {}", quarter);

}




변수에 값을 할당 했을 뿐인데 match에 실행되도록 사용한 println이 실행이 되었다.

즉, 표현식이 실행이 되면, 컴파일러는 match에서 해당 표현식을 순차적으로 찾는다. 매칭이 되면 해당 arm이 값을 리턴한다.



Option도 사용해보자.

fn main() {

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


    println!("five : {:?}", five);

    println!("six : {:?}", six);

    println!("none : {:?}", none);

}






반응형

'프로그래밍 > RUST' 카테고리의 다른 글

러스트 18 - Collections #1 : Vector  (0) 2019.03.31
러스트 17 - if let  (0) 2019.03.30
러스트 15 - 열거형 #1  (0) 2019.03.24
러스트 14 - 구조체 #2 : 메소드  (0) 2019.03.10
러스트 13 - 구조체 #1  (0) 2019.03.10
Comments