Rust - смешивать макрос по умолчанию и личную реализацию по умолчанию - PullRequest
0 голосов
/ 31 января 2020

Я хочу знать, возможно ли позволить Rust определить реализацию по умолчанию для моей структуры с помощью макроса #[derive(Default)], но определить некоторые значения по умолчанию для некоторых полей.

Я хочу сделать это, чтобы избежать определения значения по умолчанию для всех полей, когда Rust может это сделать.

Спасибо за ваше время

1 Ответ

1 голос
/ 31 января 2020

Насколько я знаю, derive(Default) - это все или ничего.

Однако вы можете инициализировать Default поля с помощью field: Default::default() (что может быть уже достаточно просто). Вы можете использовать этот факт для написания макроса, который принимает все Default доступные поля и инициализирует их, например:

macro_rules! defaultable{
    (
        $t: ty,
        @default($($default_field:ident,)*)
        @custom($($custom_field:ident = $custom_value:expr,)*)
    )
    => {
    impl Default for $t {
        fn default() -> Self {
            Self {
                $($default_field: Default::default(),)*
                $($custom_field: $custom_value,)*
            }
        }
    }
}}

struct S {
    n1: usize,
    n2: usize,
    b: bool,
    non_default: usize,
}

defaultable!(S, @default(n1, n2, b,) @custom(non_default=42,));

fn main() {
    let s : S = Default::default();
    println!("{}", s.non_default);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...