无法将字符串以外的值添加到嵌套的hashmap

时间:2018-03-13 07:34:20

标签: hashmap rust

我想创建一个带有嵌套结构的HashMap,例如这个错综复杂的例子:

{
   type: boy
   name: Phineas
   father:
       type: man
       name: Lawrence
}

在Rust中,这将是:

use std::collections::HashMap;

let mut lawrence = HashMap::new();
lawrence.insert("type", "man");
lawrence.insert("name", "Lawrence");
let mut phineas = HashMap::new();
phineas.insert("type", "boy");
phineas.insert("name", "Phineas");
phineas.insert("father", lawrence);

HashMap值只能是字符串,似乎;如果我尝试编译我得到:

expected &str, found struct `std::collections::HashMap`

我检查了文档,但找不到构建类似数据结构的简单解决方案。

2 个答案:

答案 0 :(得分:4)

我假设你来自动态类型的语言。在这种情况下,你真的需要通读Rust Book,因为Rust是非常不同的野兽。 Rust是静态类型的,所以你在这里尝试做的几乎不会起作用,绝对不是你打算如何使用这种语言。

在这种特殊情况下,没有简单的答案,因为我不知道你的目标是什么。 Rust中的数据结构建模是通过struct s,enum s,VecHashMap等集合,Option等实用程序类型以及各种指针类型,例如BoxRc等。您需要的具体组合取决于您尝试表示的内容,打算如何构建它,以及你打算如何使用它。

一个可能的配方将是:

struct Person {
    kind: PersonKind,
    name: String,
    father: Option<Box<Person>>,
}

enum PersonKind {
    Boy,
    Man,
}

答案 1 :(得分:0)

HashMap是通用的。当您第一次插入时,编译器确定类型,并且不允许您使用其他类型。

pub struct HashMap<K, V, S = RandomState> { /* fields omitted */ }

pub fn insert(&mut self, k: K, v: V) -> Option<V>

V是您的值的类型,K是键的类型。由于Rust具有静态类型系统,因此必须考虑这一点。