首页 > 解决方案 > Rust 是否可以在过程宏代码中调用宏?

问题描述

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

#[my_proc_macro]
impl Foo {
  pub fn bar1() {}
  pub fn bar2() {}
}

现在宏用户可能不想编写这些方法,相反,他想调用一个宏来生成这些方法,例如:

#[my_proc_macro]
impl Foo {
  generate_methods!();
}

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

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

标签: rust

解决方案


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

但是,这已经是很长一段时间内的一个已知问题。搜索词是“渴望宏扩展”。这个开放的 RFC于 2018 年 2 月开始:

为过程宏公开一个 API 以选择加入渴望扩展。这将:

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

所以人们正在努力,但我不会指望很快就能得到这个功能。毕竟这不是一个简单的问题。


推荐阅读