The Eq
and PartialEq
traits support the following attributes:
The PartialEq
trait also supports the following attributes:
Unfortunatelly, there is no way for derivative to derive PartialEq
on enumerations as efficiently as the built-in derive(PartialEq)
yet.
If you want to use derivative on enumerations anyway, you can add
#[derivative(PartialEq="feature_allow_slow_enum")]
to your enumeration. This acts as a “feature-gate”.
You can use derivative to ignore a field when comparing:
#[derive(Derivative)] #[derivative(PartialEq)] struct Foo { foo: u8, #[derivative(PartialEq="ignore")] bar: u8, } assert!(Foo { foo: 0, bar: 42 } == Foo { foo: 0, bar: 7}); assert!(Foo { foo: 42, bar: 0 } != Foo { foo: 7, bar: 0});
Usually fields are compared using ==
. You can use an alternative comparison function if you like:
#[derive(Derivative)] #[derivative(PartialEq)] struct Foo { foo: u32, #[derivative(PartialEq(compare_with="path::to::my_cmp_fn"))] bar: SomeTypeThatMightNotBePartialEq, }
foo
will be compared with ==
and bar
will be compared with path::to::my_cmp_fn
which must have the following prototype:
fn my_cmp_fn(&T, &T) -> bool;
Usually a T: Eq
bound is added for each type parameter T
. You can use override this behaviour if the infered bound is not correct for you.
Eg. comparing raw pointers does not require the type to be Eq
, so you could use:
#[derive(Derivative)] #[derivative(Eq)] struct WithPtr<T: ?Sized> { #[derivative(Eq(bound=""))] foo: *const T }
See Default
's documentation for more details.