Derive (Автоматическая реализация)
Атрибут derive вызывает один или несколько derive macros, позволяя автоматически генерировать новые элементы для структур данных. Вы можете создавать derive макросы с помощью procedural macros.
Example
Макрос
PartialEqсоздаёт реализацию типажаPartialEqдляFoo<T> where T: PartialEq. МакросCloneаналогично создаёт реализацию дляClone.#![allow(unused)] fn main() { #[derive(PartialEq, Clone)] struct Foo<T> { a: i32, b: T, } }Сгенерированные
implблоки эквивалентны:#![allow(unused)] fn main() { 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() } } } }
Атрибут derive использует синтаксис MetaListPaths для указания списка путей к derive macros, которые нужно вызвать.
Атрибут derive может применяться только к структурам, перечислениям и объединениям.
Атрибут derive может использоваться на одном элементе любое количество раз. Все макросы, перечисленные во всех атрибутах, будут вызваны.
Атрибут derive экспортируется в прелюдию стандартной библиотеки как core::prelude::v1::derive.
Встроенные (built-in) derive макросы определены в языковой прелюдии. Список встроенных макросов:
Встроенные derive макросы включают атрибут automatically_derived в генерируемые ими реализации.
Во время раскрытия макросов для каждого элемента в списке derives вызывается соответствующий derive макрос, который раскрывается в ноль или более элементов.
Атрибут automatically_derived
Атрибут automatically_derived используется для пометки реализации, указывая, что она была автоматически создана derive macros. Он не имеет прямого эффекта, но может использоваться инструментами и диагностическими линтами для обнаружения этих автоматически сгенерированных реализаций.
Example
Для
#[derive(Clone)]наstruct Example, derive macros может создать:#![allow(unused)] fn main() { struct Example; #[automatically_derived] impl ::core::clone::Clone for Example { #[inline] fn clone(&self) -> Self { Example } } }
Атрибут automatically_derived использует синтаксис MetaWord.
Атрибут automatically_derived может применяться только к реализациям.
Note
rustcигнорирует использование в других позициях, но выдает предупреждение (lint). В будущем это может стать ошибкой.
Использование automatically_derived более одного раза на реализации имеет тот же эффект, что и однократное использование.
Note
rustcвыдает предупреждение на любое использование после первого.
Атрибут automatically_derived не имеет поведения.