Я хочу создать 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`

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

0
MichielB 13 Мар 2018 в 10:34

2 ответа

Лучший ответ

Я предполагаю, что вы пришли с языка с динамической типизацией. В этом случае вам действительно нужно прочитать Rust Закажите, поскольку Rust - это совсем другой зверь. Rust имеет статическую типизацию, поэтому то, что вы здесь пытаетесь сделать, в значительной степени просто не сработает, и определенно не то, как вы должны использовать этот язык.

В этом конкретном случае нет простого ответа, потому что я не знаю, какова ваша цель. Моделирование структуры данных в Rust осуществляется с помощью комбинации struct s, enum s , коллекции, такие как Vec и HashMap, служебные типы, такие как Option, и различные типы указателей, такие как Box, Rc, и т. д. Какая конкретная комбинация из них вам нужна, зависит от того, что вы пытаетесь изобразить, как вы собираетесь ее построить и как вы собираетесь ее использовать.

Одна возможная формулировка:

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

enum PersonKind {
    Boy,
    Man,
}
4
DK. 13 Мар 2018 в 07:52

HashMap является общим. Когда вы вставляете в первый раз, компилятор определяет тип и не позволяет вам использовать другой тип.

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

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

V - это тип ваших значений, а K - тип ключей. Поскольку в Rust есть система статических типов, это необходимо учитывать.

0
Shepmaster 13 Мар 2018 в 12:51