2014-12-20 12 views
26

Jak mogę utworzyć literał HashMap w Rust? W Pythonie mogę to zrobić tak:Jak utworzyć literał HashMap?

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

aw idź tak:

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

Odpowiedz

32

Nie ma map dosłowne składni w Rust. Nie wiem, dlaczego dokładnie, ale spodziewam się, że fakt, że istnieje wiele struktur danych, które działają maplike (takich jak zarówno BTreeMap i HashMap) będzie trudno wybrać jeden.

Można jednak utworzyć makro, aby wykonać zadanie za Ciebie, jak pokazano w artykule Why does this rust HashMap macro no longer work?. Tutaj jest to, że makro uproszczone nieco i wystarczająco dużo struktury, aby to runnable in the playground:

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

Jest także jeden w skrzyni 'grabbag_macros'. Możesz zobaczyć źródło tutaj: https://github.com/DanielKeep/rust-grabbag/blob/master/grabbag_macros/src/lib.rs#L3-L64. –

5

Polecam maplit skrzynię.

Cytując z dokumentacji:

Makra dla literałów kontenerowych z określonego typu.

#[macro_use] extern crate maplit; 

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

maplit skrzyni stosuje => składni odwzorowywania makra. Nie można używać: jako separatora ze względu na składniowe ograniczenia w zwykłych makro_rulesach! makra.

Należy pamiętać, że makra rdzy są elastyczne w nawiasach używanych do wywoływania. Możesz użyć ich jako hashmap! {} Lub hashmap! [] Lub hashmap!(). Ta skrzynia sugeruje {} jako konwencję dla makr zestawów map &, dopasowuje ich wyjście do debugowania.

Makra

btreemap Tworzenie BTreeMap z listy par klucz-wartość

btreeset Tworzenie BTreeSet z listy elementów.

HashMap Tworzenie HashMap z listy par klucz-wartość

HashSet Tworzenie HashSet z listy elementów.