24b0d121e0c176b660b8f68b12d21a1d29fc5385

다른 언어의 enum은 상수에 이름을 붙인것에 가깝지만 러스트 열거형은 값을 변수처럼 가질 수 있는게 가장 큰 특징입니다.
// boring some other language
enum Color {
    Red, //0
    Green, //1
    Blue //2
};

// wonderful language rust
enum Message {
    Quit,                       // 데이터 없음
    Move { x: i32, y: i32 },    // 구조체 형태의 데이터
    Write(String),              // 튜플 형태의 데이터
    ChangeColor(i32, i32, i32), // 여러 데이터
}

그리고 이넘을 다룰 땐 반드시 모든 경우의 수를 다 다루도록 문법적 제약이 있습니다.

fn process_message(msg: Message) {
    match msg {
        Message::Quit => println!("프로그램 종료"),
        Message::Move { x, y } => println!("이동: {}, {}", x, y),
        Message::Write(text) => println!("출력: {}", text),
        Message::ChangeColor(r, g, b) => println!("색상 변경: {}, {}, {}", r, g, b),
    }
}

그리고 러스트의 자랑스러운 널 세이프티와 에러 핸들링은 바로 이 열거형을 통해 이루어집니다.

널값 대신 널이 가능한 데이터는 옵션 타입으로 처리하며 옵션은 이넘이므로 널인 경우와 데이터가 있는 경우를 모두 처리해야 합니다.
enum Option<T> {
    Some(T),
    None,
}

에러가 발생할 수 있는 함수는 리절트 타입으로 처리해야하며 동작의 성공시 정상적인 값을, 실패시 에러 정보를 반환할 스 있습니다. 이를 호출하는 쪽은 반드시 정상동작과 에러상횡에 대한 처리를 해야합니다.
enum Result<T, E> {
    Ok(T),
    Err(E),
}

- dc official App