#enums #discriminant #variant #derive #equals

discrimenum

仅在枚举的区分符(discriminant)重要时,派生 HashPartialEq

1 个不稳定版本

0.1.0 2022年4月6日

#11 in #discriminant

MIT/Apache

9KB

discrimenum

仅在枚举的区分符(discriminant)重要时,派生 HashPartialEq

为什么?

有时你有一个枚举,其变体可能包含一些数据。然而,在比较或散列时,你并不一定关心这些数据是什么,只关心区分符是否匹配。这可以通过一个超级简单的实现来完成——它实际上只有五行代码。这个 crate 仅为此提供了便利。

用法

默认情况下,discrimenum 的派生会采用相应特质的名字。这意味着你只需要添加以下行即可使一切正常工作

use discrimenum::{Hash, PartialEq};

请注意,这将自动覆盖预导入的现有派生,防止在当前作用域内使用非 discrimenum。

如果这不可取,那么...

  • 请指定名称: use

  • 重命名它: use discrimenum::Hash as DHash;

  • 作用域

    // ...
    {
      use discrimenum::Hash;
      #[derive(Hash)]
      enum Foo {
        // ...
      }
    }
    // ...
    

然后将其应用于您的枚举

use discrimenum::{Hash, PartialEq};

#[derive(Hash, PartialEq, Debug)]
enum MyEnum {
    A(usize),
    B(usize)
}

assert_eq!(MyEnum::A(123), MyEnum::A(321));
assert_ne!(MyEnum::A(123), MyEnum::B(123));

泛型

这同样适用于泛型枚举。实际上,由于我们只关心区分符,因此不需要对泛型进行绑定。

use discrimenum::{Hash, PartialEq};

#[derive(Hash, PartialEq)]
enum MyGenericEnum<T> {
    A(T),
    B(T)
}

// Notice we can put `T` instead of `T: Hash + PartialEq` 

与其他类似 crate 的区别?

没有。只是想再添加一个(😉)

依赖

~1.5MB
~35K SLoC