Как сделать публичную структуру, где все поля являются публичными, не повторяя `pub` для каждого поля?

Как я могу определить публичную структуру в Rust, где все поля являются открытыми, не повторяя pub модификатор перед каждым полем?

pub_struct макрос был бы идеальным:

pub_struct! Foo {
    a: i32,
    b: f64,
    // ...
}

что будет эквивалентно:

pub struct Foo {
    pub a: i32,
    pub b: f64,
    //...
}

1 ответ

macro_rules! pub_struct {
    ($name:ident {$($field:ident: $t:ty,)*}) => {
        #[derive(Debug, Clone, PartialEq)] // ewww
        pub struct $name {
            $(pub $field: $t),*
        }
    }
}

К несчастью, derive может применяться только к структурам, перечислениям и объединениям, поэтому я не знаю, как поднять их для звонящего.

Использование:

pub_struct!(Foo {
    a: i32,
    b: f64,
});

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

Другие вопросы по тегам