如何在不为每个字段重复“pub”的情况下创建一个所有字段都是公共的公共结构?

Pet*_*ron 10 struct public rust rust-macros

如何在 Rust 中定义一个公共结构,其中所有字段都是公共的,而不必pub在每个字段前重复修饰符?

一个pub_struct宏将是理想的:

pub_struct! Foo {
    a: i32,
    b: f64,
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这相当于:

pub struct Foo {
    pub a: i32,
    pub b: f64,
    //...
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ron 11

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

不幸的是,derive可能只适用于结构、枚举和联合,所以我不知道如何将它们提升给调用者。

用法:

pub_struct!(Foo {
    a: i32,
    b: f64,
});
Run Code Online (Sandbox Code Playgroud)

如果我不需要括号和分号,即如果 Rust 支持阅读器宏,那就太好了。

  • [Rust 的 API 指南建议在宏语法中包含 `struct` 关键字](https://rust-lang-nursery.github.io/api-guidelines/macros.html#input-syntax-is-evocative-of-the -输出-c-令人回味)。这也将允许 [更清晰地处理派生宏](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=61504b1b45811535371c28e8b55b7aae)。 (4认同)