如何在宏中添加前缀/后缀标识符?

ide*_*n42 13 macros rust

使用定义函数的宏时,是否可以为函数添加前缀?

macro_rules! my_test {
    ($id:ident, $arg:expr) => {
        #[test]
        fn $id() {
            my_test_impl(stringify!($id), $arg);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

例如, fn my_test_$id() {

我正在使用可能以数字开头的标识符来定义测试,我想使用公共前缀.

DK.*_*DK. 7

[...]是否可以为函数添加前缀?

不,真的,真的没有. 超级完全没有,即使是最轻微的.

我想使用一个共同的前缀.

把它们全部mod放进去.

  • @allTwentyQuestions:实际上,这是一个比这更基本的限制.简短版本:为了使其工作,您必须能够在"标识符"位置使用宏.你不能.另一种方法是使用某种明确的"令牌连接"*语法*.没有.卫生与它没有任何关系. (3认同)
  • 这个答案是错误的, concat_idents!() 完成了这个任务。 (3认同)
  • 需要澄清的是,由于[宏观卫生](https://doc.rust-lang.org/book/macros.html#hygiene),这是不可能的,这是一个功能,也是一个限制。 (2认同)

ide*_*n42 7

目前这在稳定版中不受支持。


但是, nightly 有一个功能叫做concat_idents:

concat_idents!(my_test_, $id)
Run Code Online (Sandbox Code Playgroud)

看

更新:似乎没有近期计划将其添加到稳定版本中,请参阅问题。

  • 仍然值得提出来,即使只是为了说明这是可能的/计划好的(但可能不会得到支持)。 (3认同)
  • 我没有提到 `concat_idents!` 的原因是,正如那个问题中提到的,*无用*。无法修复;问题在于宏 * 自身 * 的工作方式。`concat_idents!` 上的任何工作都无法改善这种情况;必须更改宏系统以允许对 AST 节点进行急切的重新标记化,或者必须修改编译器以允许宏在任何地方使用名称(这将非常具有破坏性)。因此,即使存在与此问题相关的问题,也不会是这个问题。这就是我懒得提的原因。 (2认同)
  • concat_idents!太棒了!您终于可以将常量名称添加到宏内的标识中。concat_idents(foo, $bar). 这对于执行某些宏操作所需的元名称至关重要。遗憾的是,它目前仅适用于夜间。 (2认同)