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;