我对Rust(1.31)还很陌生,想了解一个简单的代码片段,但它无法编译:
fn main() {
s = String::from("foo");
match s {
"foo" => {
println!("Yes");
}
_ => {
println!("No");
}
}
}
相关的错误是:
10 | "foo" => {
| ^^^^^ expected struct `std::string::String`, found reference
在这个错误之后,我决定将代码更改为:
fn main() {
let s = String::from("foo");
match s {
String::from("foo") => {
println!("Yes");
}
_ => {
println!("No");
}
}
}
这样做的目的是为了得到正确的类型,但事实并非如此:
10 | String::from("foo") => {
| ^^^^^^^^^^^^^^^^^^^ not a tuple variant or struct
我对编译器的这条消息感到困惑,最终我通过实施以下操作使其正常工作:
fn main() {
let s = String::from("foo");
match &s as &str {
"foo" => {
println!("Yes");
}
_ => {
println!("No");
}
}
}
然而,我不理解使这个解决方案正确的基本机制,以及为什么我的第二个例子不起作用。
String::from
)。字面量"foo"
是一个模式。 - Peter HallString
解引用为str
。也就是说,String
实现了Deref
特质,并将str
作为其输出类型。 - Peter Hall