Пока возился с некоторым примером кода, я обнаружил, что не могу заставить 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
s?