相关疑难解决方法(0)

调用println!错误:预期文字/格式参数必须是字符串文字

这个非常简单的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)

工作良好.

这个错误的含义对我来说并不清楚,谷歌的搜索并没有真正揭示它.为什么传递cprintln!宏会导致编译时错误?这似乎是非常不寻常的行为.

rust

57
推荐指数
3
解决办法
2万
查看次数

宏可以匹配常量参数而不是文字吗?

鉴于宏匹配示例,这显示了宏如何匹配参数。

我在这里做了非常小的改动来使用数字:

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语句对我来说不可用,因为在我的代码中,每个分支都解析为不同的类型,从而产生错误。所以我特别想知道是否可以将常量传递给宏。

macros rust

2
推荐指数
1
解决办法
2888
查看次数

标签 统计

rust ×2

macros ×1