Expand description
§iderive: Inner Derive
iderive is a drop-in replacement for derive that doesn’t directly depend
on generic bounds. It only checks the types of a struct’s fields when deriving
a trait.
§Example
ⓘ
#[derive(Clone, Copy)]
struct TaggedIndex<T: ?Sized> {
index: usize,
_tag: PhantomData<T>,
}
let a = TaggedIndex::<String> { index: 0, _tag: PhantomData };
let b = a;
let c = a; // Error: Value used after moveThis won’t work because derive requires that T implements Copy for
TaggedIndex to be able to derive it.
In contrast, iderive only checks the struct’s fields to determine if a
trait can be derived. Because usize and PhantomData<T> implements Copy
regardless of the type of T, iderive(Copy) will implement Copy for
TaggedIndex:
#[iderive(Clone, Copy)]
struct TaggedIndex<T: ?Sized> {
index: usize,
_tag: PhantomData<T>,
}
let a = TaggedIndex::<String> { index: 0, _tag: PhantomData };
let b = a;
let c = a; // Works!§Supported traits
iderive is currently implemented for Clone, Copy, Debug,
Default, PartialEq, Eq, PartialOrd, Ord and Hash.
§Recent changes
-
1.2.4
- Fix parsing of where clauses
-
1.2.3
- Fix parsing of field visibility, attributes and function trait bounds
-
1.2.0
- Rewrite; iderive now has no dependencies
- Don’t use canonical implementations, because this breaks if the other trait fails bounds
See CHANGELOG.md for older changes
Attribute Macros§
- iderive
- Inner derive. Used like
derive. See the crate documentation for details.