web-dev-qa-db-ja.com

HashMapリテラルを作成するにはどうすればよいですか?

RustでHashMapリテラルを作成するにはどうすればよいですか? 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 {}
            }
        }
    }
}
50

Rustにはマップリテラルの構文はありません。 exact理由はわかりませんが、マップのように振る舞う複数のデータ構造(両方など BTreeMap および HashMap )を選択することは困難です。

ただし、 なぜRust HashMapマクロが機能しなくなったのですか? で示されているように、ジョブを実行するマクロを作成できます。ビットとそれを作るのに十分な構造を持つ 遊び場で実行可能

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

私は maplit クレートをお勧めします。

ドキュメントから引用するには:

特定のタイプのコンテナリテラルのマクロ。

#[macro_use] extern crate maplit;

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

マッピングマクロのmaplitクレート用途=>構文。セパレータとしてによる定期的なmacro_rulesで構文制限のために:使用することはできません!マクロ。

あなたはハッシュマップとしてそれらを使用することができますRustマクロを使用すると、呼び出しに使用するブラケットれる柔軟であることに注意してください。!{}またはハッシュマップ![]またはハッシュマップ!()。このクレートはよう} {示唆しますマップ&セットマクロの規約は、それは彼らのデバッグ出力と一致します。

マクロ

btreemapキーと値のペアのリストからBTreeMapを作成します。

btreeset要素のリストからBTreeSetを作成します。

ハッシュマップのキーと値のペアのリストからHashMapを作成します。

hashSetの要素のリストからHashSetのを作成します。

23
David J.

_ HashMapのドキュメント でこれを達成する方法の例があります。

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