RUST 열거형

Alpha, Orderly·2024년 6월 2일

RUST

목록 보기
4/11

열거형

  • 하나의 타입이 가질수 있는 경우를 열거한것

열거형 정의하기

  • enum 이름 { A, B }
enum IpAddrKind {
    V4,
    V6,
}
  • 값 사용시 :: 를 사용한다.
    let four = IpAddrKind::V4;
    let six = IpAddrKind::V6;

열거형 Variant 에 값을 지정하기

    enum IpAddr {
        V4(String),
        V6(String),
    }

    let home = IpAddr::V4(String::from("127.0.0.1"));

    let loopback = IpAddr::V6(String::from("::1"));
  • 열거형 배리언트에 데이터를 직접 붙힐수 있다.
  • 한개 이상의 값을 가질수도 있다.
    enum IpAddr {
        V4(u8, u8, u8, u8),
        V6(String),
    }

    let home = IpAddr::V4(127, 0, 0, 1);

    let loopback = IpAddr::V6(String::from("::1"));
  • 심지어 구조체도!
struct Ipv4Addr {
    // --생략--
}

struct Ipv6Addr {
    // --생략--
}

enum IpAddr {
    V4(Ipv4Addr),
    V6(Ipv6Addr),
}
  • 아주 복잡한 예시
enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

Option 열거형

  • 값이 있어나 없을수 있는 상황을 나타낸다.
enum Option<T> {
    None,
    Some(T),
}

    let some_number = Some(5);
    let some_char = Some('e');
    let absent_number: Option<i32> = None;
  • 값이 있거나 None 이다.

Match 제어 흐름

  • 일련의 패턴과 어떤 값을 비교하고 매칭 기반으로 코드를 수행한다.
enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
}

fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => 1,
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter => 25,
    }
}
  • coin의 종류에 따라 코드를 실행하는 예시

값을 바인딩 하는 패턴

#[derive(Debug)] // so we can inspect the state in a minute
enum UsState {
    Alabama,
    Alaska,
    // --생략--
}

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}
// Quarter 에 값이 바인딩 되어 있다.

fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => 1,
        Coin::Nickel => 5,
        Coin::Dime => 10,
        // 패턴을 이용해 값을 가져온다.
        Coin::Quarter(state) => {
            println!("State quarter from {:?}!", state);
            25
        }
    }
}

Option 의 값을 가져오는 예시

    fn plus_one(x: Option<i32>) -> Option<i32> {
        match x {
            None => None,
            // Some 일 경우 1을 더해 리턴한다.
            Some(i) => Some(i + 1),
        }
    }

    let five = Some(5);
    let six = plus_one(five);
    let none = plus_one(None);
  • 단 match를 사용할 경우 모든 case를 전부 작성해야 한다.
    fn plus_one(x: Option<i32>) -> Option<i32> {
        match x {
            Some(i) => Some(i + 1),
        }
    }
// None 에 대한 케이스가 없어 에러가 발생한다.

포괄패턴

    let dice_roll = 9;
    match dice_roll {
        3 => add_fancy_hat(),
        7 => remove_fancy_hat(),
        other => move_player(other),
    }

    fn add_fancy_hat() {}
    fn remove_fancy_hat() {}
    fn move_player(num_spaces: u8) {}
  • other 은 3 과 7이 아닌 모든 경우의 패턴이다.
    let dice_roll = 9;
    match dice_roll {
        3 => add_fancy_hat(),
        7 => remove_fancy_hat(),
        _ => (),
    }

    fn add_fancy_hat() {}
    fn remove_fancy_hat() {}
  • 포괄턴의 값을 사용할 필요가 없는 경우는 _ 를 쓸수 있다.

if let 흐름

    let config_max = Some(3u8);
    if let Some(max) = config_max {
        println!("The maximum is configured to be {}", max);
    }
  • 어떤값이 Some일 때에만 코드를 실행하게 한다.
  • 다른경우는 무시된다.
    let mut count = 0;
    if let Coin::Quarter(state) = coin {
        println!("State quarter from {:?}!", state);
    } else {
        count += 1;
    }
  • 다른 경우를 처리하는 예시, else 를 사용한다.
profile
만능 컴덕후 겸 번지 팬

0개의 댓글