据我所知,Rust支持#[derive]属性,以便在编译时从数据结构生成代码。如何为整个包装箱,模块或功能生成代码?此处不允许使用#[derive]属性。

我想生成一个涉及项目中多个项目(结构/枚举/函数)的函数。

例如,此处给定的示例模块

#[derive(MyAgg)]
mod AAA {
    struct BBB {}
    struct CCC {}
    fn ddd() {}
}

我想生产这个。
fn example1() {
    print("{:?}", AAA::BBB {});
    print("{:?}", AAA::CCC {});
    AAA::ddd()
}

这个例子没有道理,但我认为这是正确的。

最佳答案

#[derive]属性在模块上是不允许的,仅在结构,枚举和联合上是不允许的:

error: `derive` may only be applied to structs, enums and unions
 --> src/main.rs:1:1
  |
1 | #[derive(MyAgg)]
  | ^^^^^^^^^^^^^^^^

Playground

有关扩展#[derive]宏的更多信息,可以在Rust书的Procedural Macros (and custom Derive)中找到。

但是,您可以创建自己的程序宏。您可以查阅RFC来了解proc-macros。看看其他 crate (例如SerdeDerivative)也没有什么害处。

10-01 19:55