#16 Rustで学ぶ辞書型(マップ)の基本
Rustで名前と値の組み合わせを扱うには、HashMapという仕組みを使います。この記事では、Rustにおける辞書に相当する使い方と、安全な値の取り出し方を解説します。
HashMapを作ってみる
use std::collections::HashMap;
let mut person = HashMap::new();
person.insert("name", "太郎");
person.insert("job", "エンジニア");
値を取り出す
Rustでは、キーが存在しない可能性を考慮し、get()はOption型という「値があるかないか」を表す型を返します。
match person.get("name") {
Some(name) => println!("{}", name),
None => println!("見つかりません"),
}
既定値をあらかじめ決めておきたい場合はunwrap_orが便利です。
let name = person.get("name").unwrap_or(&"名無し");
println!("{}", name);
キーの有無を確認する
if person.contains_key("name") {
println!("nameキーがあります");
}
全てのキーと値を順に処理する
for (key, value) in &person {
println!("{}: {}", key, value);
}
キーが無いときだけ値を設定する
「既にあれば何もせず、無ければ挿入する」という処理はentryを使うと1行で書けます。
person.entry("age").or_insert("20");
entryとor_insertを組み合わせる書き方は、集計処理(出現回数を数えるなど)でも頻繁に使われる、Rustらしいイディオムです。
Rustならではの注意点
他の言語のように、存在しないキーに直接アクセスしてエラーメッセージだけを表示する、ということはRustではできません。get()の結果がSomeかNoneかを必ず確認する必要があり、この一手間が、存在しないキーへのアクセスによるバグを未然に防いでいます。慣れないうちは面倒に感じるかもしれませんが、実行時に突然クラッシュするリスクを減らせる、Rustらしい安全設計だと理解しておきましょう。
まとめ
Rustの辞書はHashMapが基本で、get()の結果はOption型として安全に扱います。Some・Noneの確認や、entryによる挿入も覚えておきましょう。
本ページはプロモーションを含みます。
参考書籍(PR)
Rustをもっと学びたい方には「実践Rust入門[言語仕様から開発手法まで]」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿