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