Derive Macro Default

Source
#[derive(Default)]
{
    // Attributes available to this derive:
    #[default]
}
Expand description

Реализация трейта Default с указанием значений по умолчанию для каждого поля структуры.

Макрос поддерживает работу со всеми видами стурктур и перечислений, кроме zero-variant перечислений.

Чтобы указать дефолтное значение поля необходимо использовать атрибут #[default] с следующим синтаксисом:

#[default(10_i32)]

– выражение, которое будет подставляться в поле как его дефолтное значение указывается внутри скобок и описан как строковый литерал.

P.s. Выражение описывается строке, потому чтоrust требует указывать в атрибутах только литералы. Макрос Default в свою очередь преобразует cтроковый лиетрал в выржаение.

Например, указать дефолтное значение для поля с типом &str можно следующим образом:

#[default("crab")]

§Примеры

§1. Структуры

  • с именнованными полями:

    use std_reset_macros::Default;
    
    #[derive(Debug, Default, PartialEq)]
    struct Named {
        #[default(String::from("Ferris"))]
        first: String,
        #[default("Ferris")]
        second: &'static str,
        #[default(8_9999_999_999)]
        third: u128,
        fourth: Option<String>,
        #[default(Some(32))]
        fifth: Option<u32>,
    }
    assert_eq!(
        Named::default(),
        Named {
            first: "Ferris".to_string(),
            second: "Ferris",
            third: 8_9999_999_999,
            fourth: None,
            fifth: Some(32),
        }
    );
  • с неименнованными полями:

    #[derive(Debug, Default, PartialEq)]
    struct Unnamed(
        #[default(String::from("Ferris"))] String,
        #[default("Ferris")] &'static str,
        #[default(8_9999_999_999)] u128,
        Option<String>,
        #[default(Some(32))] Option<u32>,
    );
    assert_eq!(
        Unnamed::default(),
        Unnamed(
            "Ferris".to_string(),
            "Ferris",
            8_9999_999_999,
            None,
            Some(32),
        )
    );
  • unit-like структура:

    #[derive(Debug, Default, PartialEq)]
    struct Unit;
    assert_eq!(Unit::default(), Unit);

§2. Перечисления

  • unit-like:
    #[derive(Default, PartialEq, Debug)]
    enum Units {
        #[default]
        One,
        Two,
    }
    assert_eq!(Units::default(), Units::One);
  • tuple-like:
    #[derive(Default, PartialEq, Debug)]
    enum Unnamed {
        #[default]
        One(#[default(10)] i32),
        Two,
    }
    assert_eq!(Unnamed::default(), Unnamed::One(10));
  • struct-like:
    #[derive(Default, PartialEq, Debug)]
    enum Named {
        One,
        #[default]
        Two {
            #[default(UnnamedStruct)]
            first: UnnamedStruct,
        },
    }
    assert_eq!(
        Named::default(),
        Named::Two {
            first: UnnamedStruct
        }
    );
    
    #[derive(PartialEq, Debug)]
    struct UnnamedStruct;

with #[ignore] generic Default-trait bound:

  • without #[ignore]:

    #[derive(PartialEq, Debug, Default)]
    struct Abstract<T>(PhantomData<T>);
    
    struct Inner;
    
    Abstract::<Inner>::default();
  • with #[ignore]:

    #[derive(PartialEq, Debug, Default)]
    struct Abstract<#[ignore] T>(PhantomData<T>);
    
    struct Inner;
    
    Abstract::<Inner>::default();