Rust 是否可以在过程宏代码中调用宏?

Mas*_*ant 5 rust

例如,我在impl像这样的块上有一个过程宏属性,通常它处理方法:

#[my_proc_macro]
impl Foo {
  pub fn bar1() {}
  pub fn bar2() {}
}
Run Code Online (Sandbox Code Playgroud)

现在宏用户可能不想编写这些方法,而是想调用宏来生成这些方法,例如:

#[my_proc_macro]
impl Foo {
  generate_methods!();
}
Run Code Online (Sandbox Code Playgroud)

现在my_proc_macro将输入宏调用的标记,而不是宏调用结果的标记。

我的问题是:是否可以generate_methods!()在内部扩展my_proc_macro并使用生成的方法?

Luk*_*odt 2

不幸的是,目前(Rust 1.44.1)这是不可能的

然而,这已经是一个已知问题相当长一段时间了。搜索词是“渴望宏观扩张”。有一个于 2018 年 2 月启动的开放 RFC :

公开用于过程宏的 API 以选择热切扩展。这会:

  • 允许过程性和声明性宏处理作为输入传递的未扩展宏调用,
  • 允许宏访问它们自己构造的宏调用的结果,
  • 允许在当前语法禁止的地方使用宏。

所以人们正在研究它,但我不指望很快就能获得这个功能。毕竟这不是一个简单的问题。