为什么我不能将 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())
首先,Move::X.to_string(): String
,而不是Move::X.to_string(): &str
或Move::X.to_string(): str
。有关解释,请参阅 this。因此,即使 println!
确实接受了 &str
,也不能通过构建 String
来解决该问题(即使在调用需要 &str
的函数时,Rust可以 Deref
String
到 &str
— 但 println!
不是函数)。
其次,println!
宏总是并且只需要一个字符串文字作为它的第一个“参数”。那是因为它必须能够在编译时知道需要什么格式。
序言:这是我在 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())
首先,Move::X.to_string(): String
,而不是Move::X.to_string(): &str
或Move::X.to_string(): str
。有关解释,请参阅 this。因此,即使 println!
确实接受了 &str
,也不能通过构建 String
来解决该问题(即使在调用需要 &str
的函数时,Rust可以 Deref
String
到 &str
— 但 println!
不是函数)。
其次,println!
宏总是并且只需要一个字符串文字作为它的第一个“参数”。那是因为它必须能够在编译时知道需要什么格式。