Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 не имеет поведения.