Дискриминант enum
Дискриминант enum - это целочисленное значение, которое
связывается с каждым вариантом перечисления. По умолчанию
Rust присваивает первому варианту значение 0,
а каждому следующему - на единицу больше. Дискриминант
можно задать явно, а также получить его в коде с помощью
приведения к целому типу или метода discriminant.
Синтаксис
enum Name
{
Variant1 = value1,
Variant2 = value2,
}
Пример
Давайте создадим перечисление с явно заданными дискриминантами и выведем их значения:
enum Color
{
Red = 10,
Green = 20,
Blue = 30,
}
fn main()
{
println!("{}", Color::Red as i32);
println!("{}", Color::Green as i32);
println!("{}", Color::Blue as i32);
}
Результат выполнения кода:
10
20
30
Пример
Если дискриминанты не заданы явно, Rust присваивает их автоматически, начиная с нуля:
enum Direction
{
North,
South,
East,
West,
}
fn main()
{
println!("{}", Direction::North as i32);
println!("{}", Direction::South as i32);
println!("{}", Direction::East as i32);
println!("{}", Direction::West as i32);
}
Результат выполнения кода:
0
1
2
3
Пример
Метод discriminant позволяет получить дискриминант
варианта в виде значения типа Discriminant:
use std::mem::discriminant;
enum Status
{
Active = 100,
Inactive = 200,
Pending = 300,
}
fn main()
{
let a = Status::Active;
let b = Status::Inactive;
let c = Status::Active;
println!("{}", discriminant(&a) == discriminant(&c));
println!("{}", discriminant(&a) == discriminant(&b));
}
Результат выполнения кода:
true
false
Пример
Дискриминант можно использовать в выражениях match
для сравнения вариантов:
enum Priority
{
Low = 1,
Medium = 5,
High = 10,
}
fn main()
{
let p = Priority::High;
let level = match p as i32
{
1 => "low",
5 => "medium",
10 => "high",
_ => "unknown",
};
println!("{}", level);
}
Результат выполнения кода:
"high"
Смотрите также
-
ключевое слово
enum,
которое объявляет перечисление -
атрибут
repr,
который управляет представлением дискриминанта в памяти -
конструкция
match,
которая сопоставляет варианты enum с образцами -
конструкция
destructure,
которая извлекает данные из вариантов enum