&str在 Rust 中,人们经常看到以参数为参数的函数。
fn foo(bar: &str) {
println!("{}", bar);
}
Run Code Online (Sandbox Code Playgroud)
String当调用这样的函数时,通过引用 a 作为参数传递它是完全可以的。
let bar = String::from("bar");
foo(&bar);
Run Code Online (Sandbox Code Playgroud)
严格来说,传递的参数是 an&String并且函数期望是 an &str,但是 Rust(正如人们所希望的那样)只是计算出来并且一切正常。然而,match 语句的情况并非如此。bar如果我尝试在匹配语句中使用与之前相同的变量,则天真的用法将无法编译:
match &bar {
"foo" => println!("foo"),
"bar" => println!("bar"),
_ => println!("Something else")
};
Run Code Online (Sandbox Code Playgroud)
Rustc 抱怨它本来期待一个,&str但收到了一个&String。问题和解决方案都非常明显:只需bar更明确地借用.as_str(). 但这让我想到了真正的问题:为什么会这样?
如果 Rust 能够发现在函数参数的情况下an&String可以简单地转换为 an ,为什么它不能用 match 语句做同样的事情呢?&str这是类型系统限制的结果,还是使用 match 语句进行更奇特的借用是否存在隐藏的不安全性?或者这只是生活质量改善融入某些地方而不是其他地方的一个例子?我确信了解类型系统的人有答案,但互联网上关于这种行为小怪癖的信息似乎很少。