Ржавчина - Enums
В программировании на Rust, когда нам нужно выбрать значение из списка возможных вариантов, мы используем типы данных перечисления. Перечислимый тип объявляется с помощью ключевого слова enum . Ниже приведен синтаксис enum -
enum enum_name {
variant1,
variant2,
variant3
}
Иллюстрация: использование перечисления
В примере объявляется перечисление GenderCategory , которое имеет варианты Male и Female. Печать! макрос отображает значение перечисления. Компилятор выдаст ошибку: признак std :: fmt :: Debug не реализован для GenderCategory . Атрибут # [derive (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
Struct и Enum
В следующем примере определяется структура Person. Поле пол имеет тип GenderCategory (которое является перечислением) и может быть присвоено значение Male или Female .
// 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
Option - это предопределенное перечисление в стандартной библиотеке Rust. Это перечисление имеет два значения - Some (данные) и 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 не поддерживает ключевое слово null . Значение None в enumOption может использоваться функцией для возврата нулевого значения. Если есть данные для возврата, функция может вернуть Some (данные) .
Давайте разберемся в этом на примере -
Программа определяет функцию 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)
Заявление Match и Enum
Оператор match может использоваться для сравнения значений, хранящихся в перечислении. В следующем примере определяется функция 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 , которая возвращает тип параметра, также может быть реализован с помощью оператора соответствия, как показано ниже -
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 с перечислением, имеющим тип данных.
// The `derive` attribute automatically creates the implementation
// required to make this `enum` printable with `fmt::Debug`.
#[derive(Debug)]
enum GenderCategory {
Name(String),Usr_ID(i32)
}
fn main() {
let p1 = GenderCategory::Name(String::from("Mohtashim"));
let p2 = GenderCategory::Usr_ID(100);
println!("{:?}",p1);
println!("{:?}",p2);
match p1 {
GenderCategory::Name(val)=> {
println!("{}",val);
}
GenderCategory::Usr_ID(val)=> {
println!("{}",val);
}
}
}
Вывод
Name("Mohtashim")
Usr_ID(100)
Mohtashim