РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1245 of 1245 menu

Функция 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,
    которая проверяет, требует ли тип вызова деструктора
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить