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