在弄乱一些示例代码时,我发现我无法将HastSet<&String>
强制转换为HashSet<&str>
,反之亦然。
use std::collections::HashSet;
fn main() {
// move strings into HashSet
let known_values: HashSet<&str> = ["a", "b", "c"]
.iter().cloned().collect();
// provided an Vec<String>
let provided_values: Vec<String> = vec![
"a".to_string(),
"b".to_string(),
"z".to_string()
];
// hash set of refrences
let mut found: HashSet<&String> = HashSet::new();
found.insert(&provided_values[0]);
found.insert(&provided_values[1]);
found.insert(&provided_values[2]);
//let missing = known_values.difference(&found);
let missing = found.difference(&known_values);
println!("missing: {:#?}", missing);
}
(Playground)
编译器错误
error[E0308]: mismatched types
--> src/main.rs:23:36
|
23 | let missing = found.difference(&known_values);
| ^^^^^^^^^^^^^ expected struct `std::string::String`, found `str`
|
= note: expected reference `&std::collections::HashSet<&std::string::String>`
found reference `&std::collections::HashSet<&str>`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.
我知道您可以将
&String
强制转换为&str
,反之亦然,因此令我有些惊讶的是它没有扩展到HashSet<&String>
和HashSet<&str>
。有什么方法可以解决这个问题而不仅仅是分配String
?
最佳答案
无需使用其他类型的HashSet
。将found
更改为HashSet<&str>
即可运行该程序。
// hash set of references
let mut found: HashSet<&str> = HashSet::new();
found.insert(&provided_values[0]);
found.insert(&provided_values[1]);
found.insert(&provided_values[2]);
(Playground)
关于string - 无法将HashSet <&str>强制转换为HashSet <&String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60698946/