Macros 宏是否可以将标识符改为小写?
是否可以在Rust宏中生成符号或标识符 从一根绳子?或者对标识符执行类似字符串的操作 我想生成一个给定符号的方法,但需要对其进行降级 获取方法名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
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的粘贴板条箱现在是一种很好的方法:请任何其他路过的人注意:这个板条箱需要每晚使用,所以如果你是在稳定状态下,这是不好的。