Come posso creare un valore letterale HashMap?

Come posso creare un letterale HashMap in Rust? In Python posso farlo in questo modo:

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

E in Go in questo modo:

 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 {} } } } } 

Non c’è una syntax letterale della mappa in Rust. Non conosco la ragione esatta , ma mi aspetto che il fatto che ci siano più strutture di dati che agiscono come mappe (come BTreeMap e HashMap ) renderebbe difficile sceglierne una.

Tuttavia, puoi creare una macro per fare il lavoro per te, come dimostrato in Perché questa macro rust HashMap non funziona più? . Ecco che la macro è semplificata un po ‘e con una struttura sufficiente per renderla eseguibile nel parco giochi :

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

Raccomando la cassa maplit .

Per citare dalla documentazione:

Macro per valori letterali del contenitore con tipo specifico.

 #[macro_use] extern crate maplit; let map = hashmap!{ "a" => 1, "b" => 2, }; 

La cassa maplit utilizza => la syntax per le macro di mapping. Non è ansible utilizzare: come separatore a causa di sintattiche le restrizioni in regolari macro_rules! macro.

Nota che i macro rust sono flessibili in quali parentesi usi per l’invocazione. Puoi usarli come hashmap! {} O hashmap! [] O hashmap! (). Questa cassa suggerisce {} come convenzione per la mappa e imposta le macro, corrisponde al loro output di Debug.

Macro

btreemap Crea una BTreeMap da un elenco di coppie chiave-valore

btreeset Crea un BTreeSet da un elenco di elementi.

hashmap Crea una HashMap da un elenco di coppie chiave-valore

hashset Crea un hashset da un elenco di elementi.

C’è un esempio di come ottenere ciò nella documentazione di HashMap :

  let timber_resources: HashMap<&str, i32> = [("Norway", 100), ("Denmark", 50), ("Iceland", 10)] .iter().cloned().collect();