Невозможно принудительно установить HashSet <& str> в HashSet <& String> - PullRequest
0 голосов
/ 16 марта 2020

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

1 Ответ

2 голосов
/ 16 марта 2020

Нет необходимости иметь другой тип 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]);

( Детская площадка )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...