这个非常简单的Rust程序:
fn main() {
let c = "hello";
println!(c);
}
Run Code Online (Sandbox Code Playgroud)
抛出以下编译时错误:
error: expected a literal
--> src/main.rs:3:14
|
3 | println!(c);
| ^
Run Code Online (Sandbox Code Playgroud)
在以前版本的Rust中,错误说:
error: format argument must be a string literal.
println!(c);
^
Run Code Online (Sandbox Code Playgroud)
用以下代替程序:
fn main() {
println!("Hello");
}
Run Code Online (Sandbox Code Playgroud)
工作良好.
这个错误的含义对我来说并不清楚,谷歌的搜索并没有真正揭示它.为什么传递c给println!宏会导致编译时错误?这似乎是非常不寻常的行为.
鉴于宏匹配示例,这显示了宏如何匹配参数。
我在这里做了非常小的改动来使用数字:
macro_rules! foo {
(0 => $e:expr) => (println!("mode X: {}", $e));
(1 => $e:expr) => (println!("mode Y: {}", $e));
}
fn main() {
foo!(1 => 3);
}
Run Code Online (Sandbox Code Playgroud)
作品、印刷: mode Y: 3
但是我想使用一个常量作为参数,这可以起作用吗:
const CONST: usize = 1;
macro_rules! foo {
(0 => $e:expr) => (println!("mode X: {}", $e));
(1 => $e:expr) => (println!("mode Y: {}", $e));
}
fn main() {
foo!(CONST => 3);
}
Run Code Online (Sandbox Code Playgroud)
这在 Rust 中可能吗?
请注意,使用常规match语句对我来说不可用,因为在我的代码中,每个分支都解析为不同的类型,从而产生错误。所以我特别想知道是否可以将常量传递给宏。