如何在将字符串与字符串向量配对的哈希映射的值中添加元素?

时间:2018-11-19 05:34:58

标签: vector hashmap rust

就像许多新的Rustaceans一样,我一直在研究Rust Book。我正在阅读有关收藏的一章,并且停留在one of the exercises上。内容为:

  

使用哈希图和向量,创建一个文本界面,以允许用户将员工姓名添加到公司的部门中。例如,“将Sally添加到工程部门”或“将Amir添加到销售部门”。然后,用户可以按字母顺序检索部门中所有人员或部门中公司所有人员的列表。

到目前为止,这是我的代码:

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 :(得分:2)

您需要了解枚举变量与该变量类型之间的区别。 Entry的变体是VacantOccupied。您需要匹配这些变体,而不是它们的类型。

一种修改代码的方法如下:

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);