Учебники

Rust — Enums

В программировании 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 с перечислением, имеющим тип данных.