Функция discriminant
Функция discriminant из модуля std::mem
возвращает значение типа Discriminant, которое
представляет собой дискриминант перечисления. Параметром
функция принимает ссылку на значение перечисления, для
которого нужно получить дискриминант. Дискриминант - это
скрытое числовое значение, которое компилятор присваивает
каждому варианту перечисления. Функция особенно полезна
для сравнения вариантов перечислений, содержащих данные,
когда прямое сравнение невозможно. Значения типа
Discriminant можно сравнивать между собой с помощью
операторов равенства, при этом сравнивается именно
дискриминант, а не содержимое варианта.
Синтаксис
std::mem::discriminant(value)
Пример
Давайте получим дискриминант для двух значений перечисления
Shape и сравним их:
use std::mem;
#[derive(Debug)]
enum Shape
{
Circle(f64),
Rectangle(f64, f64),
}
fn main()
{
let a = Shape::Circle(1.0);
let b = Shape::Circle(5.0);
let c = Shape::Rectangle(2.0, 3.0);
let da = mem::discriminant(&a);
let db = mem::discriminant(&b);
let dc = mem::discriminant(&c);
println!("{}", da == db);
println!("{}", da == dc);
}
Результат выполнения кода:
true
false
Пример
Давайте используем дискриминант для сравнения вариантов перечисления без учёта их содержимого:
use std::mem;
#[derive(Debug)]
enum Value
{
Int(i32),
Float(f64),
Text(String),
}
fn main()
{
let a = Value::Int(10);
let b = Value::Int(20);
let c = Value::Text(String::from("abcde"));
let da = mem::discriminant(&a);
let db = mem::discriminant(&b);
let dc = mem::discriminant(&c);
if da == db
{
println!("same variant");
}
if da != dc
{
println!("different variant");
}
}
Результат выполнения кода:
same variant
different variant
Пример
Давайте получим дискриминанты для unit-перечисления и выведем их сравнение:
use std::mem;
#[derive(Debug)]
enum Color
{
Red,
Green,
Blue,
}
fn main()
{
let a = Color::Red;
let b = Color::Red;
let c = Color::Blue;
let da = mem::discriminant(&a);
let db = mem::discriminant(&b);
let dc = mem::discriminant(&c);
println!("{}", da == db);
println!("{}", da == dc);
}
Результат выполнения кода:
true
false
Смотрите также
-
ключевое слово
unsafe,
которое позволяет выполнять небезопасные операции -
функция
transmute,
которая преобразует один тип в другой -
функция
size_of,
которая возвращает размер типа в байтах -
функция
needs_drop,
которая проверяет, требует ли тип вызова деструктора