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