Сравнение перечислений без трейта 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)
}