[英]Why does a &str not coerce to a &String when using Vec::contains?
一位朋友让我解释Rust中的以下怪癖。 我无法,因此这个问题:
fn main() {
let l: Vec<String> = Vec::new();
//let ret = l.contains(&String::from(func())); // works
let ret = l.contains(func()); // does not work
println!("ret: {}", ret);
}
fn func() -> & 'static str {
"hello"
}
编译器会这样抱怨:
error[E0308]: mismatched types
--> src/main.rs:4:26
|
4 | let ret = l.contains(func()); // does not work
| ^^^^^^ expected struct `std::string::String`, found str
|
= note: expected type `&std::string::String`
found type `&'static str`
换句话说, &str
不会强制使用&String
。
起初我认为这与'static
,然而这是一个红色的鲱鱼。
注释行以额外分配为代价修复了示例。
我的问题:
&str
强制使用&String
? contains
工作而没有额外的分配? 你的第一个问题应该由@Marko回答。
你的第二个问题也应该很容易回答,只需使用一个闭包:
let ret = l.iter().any(|x| x == func());
不再是“真正的”答案,但我在这里为那些可能对此解决方案感兴趣的人提供了这个答案。
std::string::String
是一个可增长的堆分配数据结构,而字符串slice( str
)是内存中某个不可变的固定长度字符串。 字符串切片用作借用类型,通过&str
。 将其视为驻留在内存中某处的字符串日期的视图。 这就是为什么它没有意义的str
要挟到String
,而周围的其他方法完全是有道理的。 您在内存中的某处有一个堆分配的String
,并且您希望使用该字符串的视图(字符串切片)。
回答你的第二个问题。 无法使代码在当前表单中工作。 您需要更改为字符串切片的向量(这样,将不会有额外的分配)或使用其他contains
方法的其他contains
。
似乎Rust开发人员打算调整contains
的签名,以允许上面发布的示例工作 。
从某种意义上说,这是contains
的已知错误。 听起来修复程序不允许这些类型强制执行,但允许上面的示例工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.