3.2 Enums

enum 키워드는 하나 혹은 몇 가지 서로 다른 변수형들로 이루어진 타입를 생성할 수 있게 한다. struct로서 유효한 변수형은 enum으로도 유효하다.

// 사용하지 않는 코드 때문에 생성되는 경고를 숨기는 속성.
#![allow(dead_code)]

// `enum`을 누군가에게 설명하기 위해 만들어보자.
// 주목할 점은, 변수에 이름과 타입 정보를 함께 기재하는 방식이다.:
// `Engineer != Scientist` 그리고 `Height(i32) != Weight(i32)`.
// 각각은 다르고 독립적이다. 
enum Person {
    // `enum` 는 `unit-like` 일 수 있다,
    Engineer,
    Scientist,
    // 튜플 구조체처럼,
    Height(i32),
    Weight(i32),
    // 혹은 구조체처럼.
    Info { name: String, height: i32 }
}

// `Person` enum을 인자로 받고 아무것도 반환하지 않는 함수.
fn inspect(p: Person) {
    // `enum`의 모든 케이스를 만족하는 사용법. (반박불가)
    // 그래서 `match` 를 통해 나눠 살펴보자.
    match p {
        Person::Engineer  => println!("Is an engineer!"),
        Person::Scientist => println!("Is a scientist!"),
        // `enum` 내부를 통해 `i` 역구조화.
        Person::Height(i) => println!("Has a height of {}.", i),
        Person::Weight(i) => println!("Has a weight of {}.", i),
        // `Info`를 `name` 과 `height`으로 `Info` 역구조화.
        Person::Info { name, height } => {
            println!("{} is {} tall!", name, height);
        },
    }
}

fn main() {
    let person   = Person::Height(18);
    let amira    = Person::Weight(10);
    // `to_owned()` string 조각에서 독립된 `String`를 만든다.
    let dave     = Person::Info { name: "Dave".to_owned(), height: 72 };
    let rebecca  = Person::Scientist;
    let rohan    = Person::Engineer;

    inspect(person);
    inspect(amira);
    inspect(dave);
    inspect(rebecca);
    inspect(rohan);
}

See also:

attributes, match, fn, and String

results matching ""

    No results matching ""