我想写一个宏来定义如下内容:

let FOO: String = "FOO".to_string();

我可以有一个宏:

macro_rules! my_macro {
    ($name: ident, $val: expr) => {
        let $name: String = $val.to_string();
    }
}

用它来表示my_macro!(FOO, "FOO");

然而,这有点多余.我希望有my_macro!(FOO)左右,它可以扩展并使用$name作为标识符,但也可以在字符串值中使用.

推荐答案

你想要stringify!:

macro_rules! str_var {
    ($name:ident) => {
        let $name = String::from(stringify!($name));
    };
}

fn main() {
    str_var!(foo);
    println!("foo: {:?}", foo);
}

Rust相关问答推荐

使用nom将任何空白、制表符、白线等序列替换为单个空白

在Rust中赋值变量有运行时开销吗?

为什么我可以跟踪以前borrow 过的变量?房主在哪里?

为什么BitVec缺少Serialize trait?

在决定使用std::Sync::Mutex还是使用Tokio::Sync::Mutex时,操作系统线程调度是考虑因素吗?

为什么Rust不支持带关联常量的特征对象?

write_buffer 不写入缓冲区而是输出零 WGPU

如何正确使用git2::Remote::push?

如何从borrow 的异步代码运行阻塞代码?

更新 rust ndarray 中矩阵的一行

Google chrome 和 Apple M1 中的计算着色器

Rust:为什么 Pin 必须持有指针?

相当于 Rust 中 C++ 的 std::istringstream

Rust 异步循环函数阻塞了其他future 任务的执行

Rust中的位移操作对范围有什么影响?

有什么方法可以通过使用生命周期来减轻嵌套生成器中的当生成器产生时borrow 可能仍在使用错误?

改变不实现克隆的 dioxus UseState struct

`if let` 只是另一种编写其他 `if` 语句的方式吗?

C++ 中的 CRTP 是一种表达其他语言中特征和/或 ADT 的方法吗?

为什么这里需要类型注解?