r[attributes.derive]
r[attributes.derive.intro] The derive
[attribute][attributes] invokes one or more derive macros, allowing new items to be automatically generated for data structures. You can create derive
macros with procedural macros.
[!EXAMPLE] The [
PartialEq
][macro@PartialEq] derive macro emits an implementation of [PartialEq
] forFoo<T> where T: PartialEq
. The [Clone
][macro@Clone] derive macro does likewise for [Clone
].#[derive(PartialEq, Clone)] struct Foo<T> { a: i32, b: T, }The generated
impl
items are equivalent to:# struct Foo<T> { a: i32, b: T } impl<T: PartialEq> PartialEq for Foo<T> { fn eq(&self, other: &Foo<T>) -> bool { self.a == other.a && self.b == other.b } } impl<T: Clone> Clone for Foo<T> { fn clone(&self) -> Self { Foo { a: self.a.clone(), b: self.b.clone() } } }
r[attributes.derive.syntax] The derive
attribute uses the [MetaListPaths] syntax to specify a list of paths to derive macros to invoke.
r[attributes.derive.allowed-positions] The derive
attribute may be applied to [structs][items.struct], [enums][items.enum], and [unions][items.union].
r[attributes.derive.duplicates] The derive
attribute may be specified multiple times on an item, with all derive macros listed in all attributes being invoked.
r[attributes.derive.stdlib] The derive
attribute is exported in the standard library prelude as [core::prelude::v1::derive
].
r[attributes.derive.built-in] Built-in derives are defined in the [language prelude][names.preludes.lang]. The list of built-in derives are:
Clone
]Copy
]Debug
]Default
]Eq
]Hash
]Ord
]PartialEq
]PartialOrd
]r[attributes.derive.built-in-automatically_derived] The built-in derives include the [automatically_derived
attribute][attributes.derive.automatically_derived] on the implementations they generate.
r[attributes.derive.behavior] During macro expansion, for each element in the list of derives, the corresponding derive macro expands to zero or more items.
r[attributes.derive.automatically_derived]
automatically_derived
attributer[attributes.derive.automatically_derived.intro] The automatically_derived
[attribute][attributes] is used to annotate an implementation to indicate that it was automatically created by a derive macro. It has no direct effect, but it may be used by tools and diagnostic lints to detect these automatically generated implementations.
[!EXAMPLE] Given [
#[derive(Clone)]
][macro@Clone] onstruct Example
, the derive macro may produce:# struct Example; #[automatically_derived] impl ::core::clone::Clone for Example { #[inline] fn clone(&self) -> Self { Example } }
r[attributes.derive.automatically_derived.syntax] The automatically_derived
attribute uses the [MetaWord] syntax and so does not accept any arguments.
r[attributes.derive.automatically_derived.allowed-positions] The automatically_derived
attribute may be placed on an implementation.
[!NOTE]
rustc
currently accepts the attribute in other positions but lints against it.
r[attributes.derive.automatically_derived.duplicates] Duplicate instances of the automatically_derived
attribute on the same implementation have no effect.
[!NOTE]
rustc
lints against duplicate use of this attribute on uses following the first.
r[attributes.derive.automatically_derived.behavior] The automatically_derived
attribute has no behavior.