Как создать литерал 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 {}
}
}
}
}
Ответы
Ответ 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 из списка элементов.