#[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;