열거형

enum 키워드는 여러 variant(변종) 중 하나의 값이 될 수 있는 타입을 생성합니다. 구조체의 형태로 유효한 것은 열거형의 variant로도 유효합니다.

// 웹 이벤트를 분류하는 열거형을 생성합니다.
// 열거형의 이름뿐만 아니라 variant를 어떤 방식으로 지정하는지도 유의해주세요.
// `PageLoad`는 `PageUnload`와 다르며, `KeyPress(char)`와 `Paste(String)` 또한 다릅니다.
// 각각의 variant는 모두 다르고 독립적입니다.
enum WebEvent {
    // 열거형은 종류만 지정할 수도 있으며(`unit-like`),
    PageLoad,
    PageUnload,
    // 튜플 구조체 같은 형태도 가능하고,
    KeyPress(char),
    Paste(String),
    // C언어식 구조체도 가능합니다.
    Click { x: i64, y: i64 },
}

// `WebEvent` 열거형을 인자로 전달받고 아무것도 반환하지 않는
// 함수입니다.
fn inspect(event: WebEvent) {
    match event {
        WebEvent::PageLoad => println!("페이지 로드됨"),
        WebEvent::PageUnload => println!("페이지 언로드됨"),
        // 열거형 값 안의 `c`를 해체합니다.
        WebEvent::KeyPress(c) => println!("'{}' 눌림", c),
        WebEvent::Paste(s) => println!("\"{}\" 붙여넣음", s),
        // `Click`을 `x`, `y`로 해체합니다.
        WebEvent::Click { x, y } => {
            println!("x={}, y={} 지점 클릭됨", x, y);
        },
    }
}

fn main() {
    let pressed = WebEvent::KeyPress('x');
    // 소유권을 갖는 `String`을 생성하기 위해 문자열 슬라이스로 `to_owned()`를 호출합니다.
    let pasted  = WebEvent::Paste("텍스트".to_owned());
    let click   = WebEvent::Click { x: 20, y: 80 };
    let load    = WebEvent::PageLoad;
    let unload  = WebEvent::PageUnload;

    inspect(pressed);
    inspect(pasted);
    inspect(click);
    inspect(load);
    inspect(unload);
}

타입 별칭

타입 별칭을 사용해, 열거형의 별칭으로 각 variant를 참조할 수 있습니다. 열거형의 이름이 너무 길거나, 오히려 너무 평범해서 이름을 바꾸고 싶을 때 유용합니다.

enum VeryVerboseEnumOfThingsToDoWithNumbers {
    Add,
    Subtract,
}

// 타입 별칭을 생성합니다.
type Operations = VeryVerboseEnumOfThingsToDoWithNumbers;

fn main() {
    // 길고 불편한 이름 대신 별칭으로 각 variant를 참조합니다.
    let x = Operations::Add;
}

여러분이 가장 자주 보게 될 타입 별칭은 impl 블록 내 Self 별칭입니다.

enum VeryVerboseEnumOfThingsToDoWithNumbers {
    Add,
    Subtract,
}

impl VeryVerboseEnumOfThingsToDoWithNumbers {
    fn run(&self, x: i32, y: i32) -> i32 {
        match self {
            Self::Add => x + y,
            Self::Subtract => x - y,
        }
    }
}

See also:

match, fn, String, "Type alias enum variants" RFC