В программировании Rust, когда нам нужно выбрать значение из списка возможных вариантов, мы используем типы данных перечисления. Перечислимый тип объявляется с использованием ключевого слова enum . Ниже приводится синтаксис enum —
enum enum_name { variant1, variant2, variant3 }
Иллюстрация: использование перечисления
В этом примере объявляется enum — GenderCategory , в котором есть варианты для мужчин и женщин. Печать! макрос отображает значение перечисления. Компилятор выдаст ошибку, признак std :: fmt :: Debug не реализован для GenderCategory . Атрибут # [Derve (Debug)] используется для подавления этой ошибки.
// The `derive` attribute automatically creates the implementation // required to make this `enum` printable with `fmt::Debug`. #[derive(Debug)] enum GenderCategory { Male,Female } fn main() { let male = GenderCategory::Male; let female = GenderCategory::Female; println!("{:?}",male); println!("{:?}",female); }
Выход
Male Female
Структура и перечисление
В следующем примере определяется структура Person. Пол поля имеет тип GenderCategory (который является перечислением) и может быть назначен как мужской или женский как значение.
// The `derive` attribute automatically creates the implementation // required to make this `enum` printable with `fmt::Debug`. #[derive(Debug)] enum GenderCategory { Male,Female } // The `derive` attribute automatically creates the implementation // required to make this `struct` printable with `fmt::Debug`. #[derive(Debug)] struct Person { name:String, gender:GenderCategory } fn main() { let p1 = Person { name:String::from("Mohtashim"), gender:GenderCategory::Male }; let p2 = Person { name:String::from("Amy"), gender:GenderCategory::Female }; println!("{:?}",p1); println!("{:?}",p2); }
В этом примере создаются объекты p1 и p2 типа Person и инициализируются атрибуты, имя и пол для каждого из этих объектов.
Выход
Person { name: "Mohtashim", gender: Male } Person { name: "Amy", gender: Female }
Вариант Enum
Опция — это предопределенное перечисление в стандартной библиотеке Rust. Это перечисление имеет два значения — Some (data) и None.
Синтаксис
enum Option<T> { Some(T), //used to return a value None // used to return null, as Rust doesn't support the null keyword }
Здесь тип T представляет значение любого типа.
Rust не поддерживает нулевое ключевое слово. Значение None в enumOption может использоваться функцией для возврата нулевого значения. Если есть данные для возврата, функция может вернуть некоторые (данные) .
Позвольте нам понять это на примере —
Программа определяет функцию is_even () с типом возвращаемого значения Option. Функция проверяет, является ли переданное значение четным числом. Если вход является четным, то возвращается значение true, иначе функция возвращает None .
fn main() { let result = is_even(3); println!("{:?}",result); println!("{:?}",is_even(30)); } fn is_even(no:i32)->Option<bool> { if no%2 == 0 { Some(true) } else { None } }
Выход
None Some(true)
Заявление о совпадении и Enum
Оператор соответствия можно использовать для сравнения значений, хранящихся в перечислении. В следующем примере определяется функция print_size , которая принимает перечисление CarType в качестве параметра. Функция сравнивает значения параметров с заранее заданным набором констант и отображает соответствующее сообщение.
enum CarType { Hatch, Sedan, SUV } fn print_size(car:CarType) { match car { CarType::Hatch => { println!("Small sized car"); }, CarType::Sedan => { println!("medium sized car"); }, CarType::SUV =>{ println!("Large sized Sports Utility car"); } } } fn main(){ print_size(CarType::SUV); print_size(CarType::Hatch); print_size(CarType::Sedan); }
Выход
Large sized Sports Utility car Small sized car medium sized car
Матч с опцией
Пример функции is_even , которая возвращает тип Option, также может быть реализован с помощью оператора match, как показано ниже —
fn main() { match is_even(5) { Some(data) => { if data==true { println!("Even no"); } }, None => { println!("not even"); } } } fn is_even(no:i32)->Option<bool> { if no%2 == 0 { Some(true) } else { None } }
Выход
not even
Совпадение и перечисление с типом данных
Можно добавить тип данных к каждому варианту перечисления. В следующем примере варианты перечисления Name и Usr_ID имеют строковый и целочисленный типы соответственно. В следующем примере показано использование оператора match с перечислением, имеющим тип данных.