1 분 소요

개요

  • 구조체와 유사하게 다양한 타입과 메소드를 가질 수 있음


Option

  • 값이 있거나 없는 경우를 나타내는 열거형
  • Rust는 null 개념이 없고 Option을 사용
  • null 값을 null 이 아닌 값처럼 사용하려는 실수를 방지

예제

  • 코드

        #[derive(Debug)]
        enum Test1 {
            A,
            B,
        }

        #[derive(Debug)]
        enum Test2 {
            A(i32),
            B(String),
            C(i32, String),
        }

        #[derive(Debug)]
        struct Struct {}

        #[derive(Debug)]
        enum Test3 {
            A(Struct),
        }
        impl Test3 {
            fn print(&self) {
                println!("call print");
            }
        }

        fn main() {
            println!("1 : {:?}", Test1::A);
            println!("2 : {:?}", Test1::B);

            println!("3 : {:?}", Test2::A(1));
            println!("4 : {:?}", Test2::B(String::from("a")));
            println!("5 : {:?}", Test2::C(1, String::from("a")));

            match Test2::A(1) {
                Test2::A(i) => println!("6 : {}", i),
                Test2::B(s) => println!("6 : {}", s),
                _ => println!("6 : other"),
            }

            match Test2::C(1, String::from("a")) {
                Test2::A(i) => println!("7 : {}", i),
                Test2::B(s) => println!("7 : {}", s),
                _ => println!("7 : other"),
            }

            println!("8 : {:?}", Test3::A(Struct {}));
            Test3::A(Struct {}).print();

            let o: Option<i32> = None;
            println!("9 : {}", o.is_some());
            println!("10 : {}", o.is_none());
            match o {
                Some(t) => println!("11 : Some - {}", t),
                None => println!("11 : None"),
            }

            let o: Option<i32> = Some(1);
            println!("12 : {}", o.is_some());
            println!("13 : {}", o.is_none());
            match o {
                Some(t) => println!("14 : Some - {}", t),
                None => println!("14 : None"),
            }

            match Some(1) {
                Some(1) => println!("15 : Some(1)"),
                Some(t) => println!("15 : Some - {}", t),
                _ => println!("15 : other"),
            }

            match Some(3) {
                Some(1) => println!("15 : Some(1)"),
                Some(t) => println!("15 : Some - {}", t),
                _ => println!("15 : other"),
            }

            let o: Option<i32> = Some(1);
            if let Some(1) = o {
                println!("16 : Some(1)");
            }
        }
  • 실행 결과

        1 : A
        2 : B
        3 : A(1)
        4 : B("a")
        5 : C(1, "a")
        6 : 1
        7 : other
        8 : A(Struct)
        call print
        9 : false
        10 : true
        11 : None
        12 : true
        13 : false
        14 : Some - 1
        15 : Some(1)
        15 : Some - 3
        16 : Some(1)