Как добавить элемент к значению хеш-карты, который объединяет строки с векторами строк? - PullRequest
0 голосов
/ 19 ноября 2018

Как и многие новые русты, я пробираюсь через Книгу ржавчины .Я читаю главу о коллекциях и застрял на одном из упражнений .Он гласит:

Используя хеш-карту и векторы, создайте текстовый интерфейс, чтобы позволить пользователю добавлять имена сотрудников в отдел в компании.Например, «Добавить Салли в Инжиниринг» или «Добавить Амира в Продажи». Затем пусть пользователь получит список всех сотрудников отдела или всех сотрудников компании по отделам, отсортированный по алфавиту.

Вот мой код:

use std::collections::hash_map::OccupiedEntry;
use std::collections::hash_map::VacantEntry;
use std::collections::HashMap;
use std::io;

fn main() {
    println!("Welcome to the employee database text interface.\nHow can I help you?");

    let mut command = String::new();

    io::stdin()
        .read_line(&mut command)
        .expect("Failed to read line.");

    command = command.to_lowercase();

    let commands = command.split_whitespace().collect::<Vec<&str>>();

    let mut department = commands[3];
    let mut name = commands[1];

    let mut employees = HashMap::new();

    if commands[0] == "add" {
        match employees.entry(department) {
            VacantEntry(entry) => entry.entry(department).or_insert(vec![name]),
            OccupiedEntry(entry) => entry.get_mut().push(name),
        }
    }
}

Компилятор возвращает следующую ошибку:

error[E0532]: expected tuple struct/variant, found struct `VacantEntry`
  --> src/main.rs:26:13
   |
26 |             VacantEntry(entry) => entry.entry(department).or_insert(vec![name]),
   |             ^^^^^^^^^^^ did you mean `VacantEntry { /* fields */ }`?

error[E0532]: expected tuple struct/variant, found struct `OccupiedEntry`
  --> src/main.rs:27:13
   |
27 |             OccupiedEntry(entry) => entry.get_mut().push(name),
   |             ^^^^^^^^^^^^^ did you mean `OccupiedEntry { /* fields */ }`?

Я не совсем уверен, что я делаю неправильно.Что означают эти ошибки, и что я могу сделать, чтобы исправить их и заставить мой код компилироваться?

1 Ответ

0 голосов
/ 19 ноября 2018

Вам необходимо понять разницу между перечислимым вариантом и типом этого варианта.Варианты Entry: Vacant и Occupied.Вам нужно сопоставлять эти варианты, а не их типы.

Один из способов исправить ваш код будет выглядеть так:

use std::collections::hash_map::Entry::{Vacant, Occupied};
match employees.entry(department) {
    Vacant(entry) => { entry.insert(vec![name]); },
    Occupied(mut entry) => { entry.get_mut().push(name); },
}

Но гораздо более простое решение будет использовать возвращаемое значениеor_insert, который является ссылкой на вектор, и нажмите на него.

employees
    .entry(department)
    .or_insert(Vec::new())
    .push(name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...