2014-12-20 36 views
26

如何在Rust中創建HashMap文字?在Python我能做到這樣:如何創建一個HashMap文字?

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

而在這樣的:

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

回答

32

沒有在拉斯特地圖文字語法。我不知道確切的的原因,但我認爲有多個數據結構可以作用於map map(如BTreeMapHashMap),這使得選擇它很困難。

但是,您可以創建一個宏來爲您完成這項工作,如Why does this rust HashMap macro no longer work?中所示。下面是宏簡化了一點,有足夠的結構,使其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

'grabbag_macros'中還有一個箱子。你可以在這裏看到源代碼:https://github.com/DanielKeep/rust-grabbag/blob/master/grabbag_macros/src/lib.rs#L3-L64。 –

5

我建議maplit箱。

爲了從文檔引用:

宏用於與特定類型的容器文字。

#[macro_use] extern crate maplit; 

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

的maplit板條箱採用=>語法的映射宏。無法使用:作爲分隔符,因爲語法上常規宏規則的限制!宏。

請注意,生鏽的宏可靈活使用括號用於調用。您可以將它們用作散列表!{}或散列表![]或散列表!()。這個箱子建議{}作爲地圖&設置宏的慣例,它與它們的Debug輸出相匹配。

btreemap從鍵 - 值對

的列表創建BTreeMap btreeset從元素列表創建BTreeSet。

從HashMap的鍵值對的列表中創建一個HashMap

的HashSet從元素列表創建一個HashSet。