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

Macros 宏是否可以将标识符改为小写?,macros,rust,Macros,Rust,是否可以在Rust宏中生成符号或标识符 从一根绳子?或者对标识符执行类似字符串的操作 我想生成一个给定符号的方法,但需要对其进行降级 获取方法名 get!(B); // should expand to fn b() -> B { // method body } 很容易接近 macro_rules! get { ($kind:ident, $method:ident) => { fn $method() -> $k

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

我想生成一个给定符号的方法,但需要对其进行降级 获取方法名

get!(B);

// should expand to

fn b() -> B {
    // method body
}
很容易接近

macro_rules! get {
    ($kind:ident, $method:ident)
        =>
    {
        fn $method() -> $kind {
           // method body
        }
    }
}

get!(B, b)

但令人不满意。

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

在编译器中创建这样一个宏是可能的,但这似乎不是一个流行的需求;今天,只有实验性的操作与此接近(即标识符的字符串式操作)


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

我刚刚编写了一个过程宏()来实现这一点

#![feature(proc_macro_hygiene)]

use casey::lower;

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

更新
proc\u macro\u hygiene
从rust 1.45.0开始是稳定的,因此不再需要每晚进行清洁。

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

这些文档中的一个示例:

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,
    );
}
使用粘贴::粘贴;
粘贴{
//定义一个名为“QRST”的常量。
const[]:&str=“成功!”;
}
fn main(){
断言(
粘贴!{[].len()},
8.
);
}

还支持大小写转换,例如,
[]

相关:我一直遇到这种语言限制。有了这个功能,代码会变得更加愉快。是的,我发现了
concat_Šs,但这不是正确的选择。无论如何,谢谢你,很高兴知道它不值得搜索。另外,
concatês
有很多缺点,这种宏可能也会有这些缺点。dtolnay的粘贴板条箱现在是一种很好的方法:请任何其他路过的人注意:这个板条箱需要每晚使用,所以如果你是在稳定状态下,这是不好的。