在Rust中,人们经常看到以&str
为参数的函数.
fn foo(bar: &str) {
println!("{}", bar);
}
在调用这样的函数时,通过引用String
作为参数来传递它是非常好的.
let bar = String::from("bar");
foo(&bar);
严格地说,传递的参数是&String
,而函数期望的是&str
,但Rust(正如人们所希望的)只是算出了它,一切都很好.但是,Match语句的情况并非如此.如果我try 在Match语句中使用与前面相同的bar
变量,那么简单的用法将不会编译:
match &bar {
"foo" => println!("foo"),
"bar" => println!("bar"),
_ => println!("Something else")
};
Rustc抱怨说,它原本预计会得到&str
分,但实际上得到了&String
分.问题和解决方案都是非常明显的:只要用.as_str()
更明确地borrow bar
就行了.但这让我想到了真正的问题:为什么会出现这种情况?
如果Rust可以计算出在函数参数的情况下&String
可以很容易地转换为&str
,为什么它不能对Match语句做同样的事情呢?这是类型系统限制的结果,还是更花哨的通过Match语句borrow 的隐藏的不安全因素?或者,这仅仅是生活质量的改善被融入到一些地方而不是其他地方的情况?我相信某个了解打字系统的人会有答案,但关于互联网上这种小怪异行为的信息似乎很少.