Подтвердить что ты не робот

Как создать литерал HashMap?

Как я могу создать литерал HashMap в Rust? В Python я могу сделать это так:

hashmap = {
   'element0': {
       'name': 'My New Element',
       'childs': {
           'child0': {
               'name': 'Child For Element 0',
               'childs': {
                   ...
               }
           }
       }
   },
   ...
}

И в Go следующим образом:

type Node struct {
    name string
    childs map[string]Node
}

hashmap := map[string]Node {
    "element0": Node{
        "My New Element",
        map[string]Node {
            'child0': Node{
                "Child For Element 0",
                map[string]Node {}
            }
        }
    }
}
4b9b3361

Ответ 1

В Rust нет синтаксиса буквенного отображения. Я не знаю точной причины, но я ожидаю, что тот факт, что есть несколько структур данных, которые действуют на карте, затруднит выбор.

Однако вы можете создать макрос для выполнения задания для вас, как показано в Почему этот ржавчинный макрос HashMap больше не работает?. Вот этот макрос упростил бит и с достаточной структурой, чтобы сделать runnable на игровой площадке:

macro_rules! map(
    { $($key:expr => $value:expr),+ } => {
        {
            let mut m = ::std::collections::HashMap::new();
            $(
                m.insert($key, $value);
            )+
            m
        }
     };
);

fn main() {
    let names = map!{ 1 => "one", 2 => "two" };
    println!("{} -> {:?}", 1, names.get(&1));
    println!("{} -> {:?}", 10, names.get(&10));
}

Ответ 2

Я рекомендую maplit ящик.

Чтобы привести цитату из документации:

Макросы для контейнерных литералов определенного типа.

#[macro_use] extern crate maplit;

let map = hashmap!{
    "a" => 1,
    "b" => 2,
};

Ящик maplit использует синтаксис = > для макросов сопоставления. Невозможно использовать: в качестве разделителя из-за синтаксических ограничений в обычных macro_rules! макросы.

Обратите внимание, что макросы ржавчины являются гибкими, в каких скобках вы используете для вызова. Вы можете использовать их как hashmap! {} Или hashmap! [] Или hashmap!(). Этот ящик предлагает {} как соглашение для карты и устанавливает макросы, это соответствует их выходу Debug.

Макросы

btreemap Создайте BTreeMap из списка пар ключ-значение

btreeset Создайте BTreeSet из списка элементов.

hashmap Создать HashMap из списка пар ключ-значение

hashset Создайте HashSet из списка элементов.