为什么我不能将 println 与 str 一起使用?

Why can't I use println with a str?

序言:这是我在 Rust 上的第一天。

这是我的演示代码:

fn main() {
    println!("Hello, world!");
    println!(Move::X.to_string());
}

enum Move {
    Empty,
    X,
    O,
}

impl Move {
    fn to_string(&self) -> &'static str {
        match self {
            Move::Empty => "Empty",
            Move::X => "X",
            Move::O => "O"
        }
    }
}

由于这些错误,这没有编译

我恳请你解决,但主要是我需要一个解释。

我试过了 println!(String::from(Move::X.to_string())); 但错误是相同的。

因为 println! 是一个宏,其中第一项需要字符串文字。该字符串文字是在编译时评估的(因此它永远不会是对实际数据的引用)。

您可以使用新添加的格式化字符串:

let x = Move::X.to_string();
println!("{x}");

或通常的格式如错误消息所建议的那样:

println!("{}", Move::X.to_string())

Playground

首先,Move::X.to_string(): String,而不是Move::X.to_string(): &strMove::X.to_string(): str。有关解释,请参阅 this。因此,即使 println! 确实接受了 &str,也不能通过构建 String 来解决该问题(即使在调用需要 &str 的函数时,Rust可以 Deref String&str — 但 println! 不是函数)。

其次,println! 宏总是并且只需要一个字符串文字作为它的第一个“参数”。那是因为它必须能够在编译时知道需要什么格式。