Сравнение перечислений без трейта Eq
use std::mem;
enum Status {
Loading(u32),
Ready(String),
Error,
}
fn is_same_variant(a: &Status, b: &Status) -> bool {
mem::discriminant(a) == mem::discriminant(b)
}В enum, содержащем разные варианты, дискриминант — это внутренний числовой идентификатор (обычно целочисленный), который отличает один вариант от другого.
Функция mem::discriminant позволяет сравнивать типы вариантов без учёта данных, которые они могут хранить.
use std::mem;
#[derive(Debug)]
enum Status {
Loading(u32),
Ready(String),
Error,
}
fn is_same_variant(a: &Status, b: &Status) -> bool {
mem::discriminant(a) == mem::discriminant(b)
}
fn main() {
let s1 = Status::Loading(42);
let s2 = Status::Loading(100);
let s3 = Status::Ready("Hello".to_string());
let s4 = Status::Error;
println!("{}", is_same_variant(&s1, &s2)); // true (оба Loading)
println!("{}", is_same_variant(&s1, &s3)); // false (Loading vs Ready)
println!("{}", is_same_variant(&s3, &s4)); // false (Ready vs Error)
}