Ключевое слово enum позволяет создавать тип данных, который представляет собой один из нескольких возможных вариантов. Any variant which is valid as a struct is also valid as
an enum.
// Атрибут, который убирает предупреждения компилятора
// о неиспользуемом коде
#![allow(dead_code)]
// Создадим `enum`, для классификации кого либо. Обратите внимание на то, как
// and type information together specify the variant:
// `Engineer != Scientist` and `Height(i32) != Weight(i32)`. Each
// is different and independent.
enum Person {
// `enum` так же может быть `единичным`,
Engineer,
Scientist,
// может быть как кортежная структура,
Height(i32),
Weight(i32),
// или как просто структура.
Info { name: String, height: i32 }
}
// Функция, которая принимает Person` в качестве аргумента
// и не возвращает ничего.
fn inspect(p: Person) {
// При использование `enum` компилятору необходимо указать,
// что нужно делать при каждом из возможных вариантов.
// Для этого мы используем `match`.
match p {
Person::Engineer => println!("Is an engineer!"),
Person::Scientist => println!("Is a scientist!"),
// Деструктурируем `i` из `enum`.
Person::Height(i) => println!("Has a height of {}.", i),
Person::Weight(i) => println!("Has a weight of {}.", i),
// Деструктурируем `Info` в `name` и `height`.
Person::Info { name, height } => {
println!("{} is {} tall!", name, height);
},
}
}
fn main() {
let person = Person::Height(18);
let amira = Person::Weight(10);
// `to_owned()` создает копию `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);
}attributes, match, fn, и String