宏是否可以将标识符转为小写?

时间:2018-09-05 13:15:09

标签: macros rust

是否可以在Rust宏中生成符号或标识符 从一个字符串?还是要对标识符执行类似字符串的操作?

我想生成一个给定符号的方法,但需要将其小写为 获取方法名称。

STDOUT

很容易接近...

shell_exec()

但不满意。

3 个答案:

答案 0 :(得分:1)

以前的答案都是正确的;标准的声明性宏无法做到这一点,您可以改为使用过程宏。但是,dtolnay的paste crate是过程宏的一种更简单的替代方法(特别是如果像我一样,这是您尚未研究的语言领域)。

这些文档中的示例:

use paste::paste;

paste! {
    // Defines a const called `QRST`.
    const [<Q R S T>]: &str = "success!";
}

fn main() {
    assert_eq!(
        paste! { [<Q R S T>].len() },
        8,
    );
}

还支持大小写转换,例如[<ld_ $reg:lower _expr>]

答案 1 :(得分:0)

不,没有一个宏可以对标识符执行这种字符串操作。

可以在编译器中创建这样的宏,但是这似乎不是一种流行的需求;如今,只有实验性的concat_idents!才能达到这个目标(例如,类似字符串的标识符操作)。

您的解决方法是当前唯一可用的解决方案。

答案 2 :(得分:0)

我只是编写了一个程序宏(casey)来完成此操作。

#![feature(proc_macro_hygiene)]

use casey::lower;

lower!(B); // would render as `b`