Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
24
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@qnighy

Rustにおける連想配列リテラル・ハッシュリテラル相当

いろいろな言語の連想配列系リテラル記法を比較してみた | TechRacho という記事でRustにも言及されていますが、そこでは以下のような手続き的な構成が紹介されています。

use std::collections::HashMap;

let mut hash = HashMap::new();
hash.insert("apple".to_owned(), 1);
hash.insert("orange".to_owned(), 2);
hash.insert("coffee".to_owned(), 42);

Rustでこのように指定した値の入ったハッシュを作る場合、以下のように書くほうが好まれるかと思います。

use std::collections::HashMap;

let hash = vec![
    ("apple".to_owned(), 1),
    ("orange".to_owned(), 2),
    ("coffee".to_owned(), 42),
]
.into_iter()
.collect::<HashMap<_, _>>();

(Add IntoIterator impl for arrays by valueがマージされれば上記の vec![][] とすることができます)

また maplit クレート が以下のようなマクロを提供しています。

use maplit::hashmap;

let hash = hashmap!{
    "apple".to_owned() => 1,
    "orange".to_owned() => 2,
    "coffee".to_owned() => 42,
};

Rustのマクロは () [] {} のいずれでも呼び出せるので、 hashmap!()hashmap![] のように書いてもかまいません。 ({} だけ構文上の扱いが少しだけ異なりますが、このユースケースではほとんど問題にならないと思われます)

また本題とは逸れますが、上記のように String 型のリテラルが必要な場合は big_s クレート も便利です。

use big_s::S;
use maplit::hashmap;

let hash = hashmap![
    S("apple") => 1,
    S("orange") => 2,
    S("coffee") => 42,
];
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
24
Help us understand the problem. What are the problem?