【Rust】HashMap
こんにちは、しきゆらです。
最近またRustをちょっと勉強しているので、そのメモをちらほら放出しておこうかと思います。
読み進めているのは「手を動かして考えればよくわかる 高効率言語 Rust 書きかた・作りかた」になります。
PythonとRustのコードを比較しながら、Rustの文法や特色についてを解説してくれる本になっています。
いきなり細かい文法をつらつら書かれてもわからないよ!という方やひとまず手を動かしてちょっとずつ書けるようになりたいよ、という方にオススメの本です。
ちなみに、自分は前者であり後者だったので割ととっつきやすく読めています。
ということで、読みながら手を動かした記録を残していきます。
今回はHashMapについて。
なお、この本を読んでメモする記事には「手を動かして考えればよく分かる Rustの書き方」のタグをつけておきます。
私と同じようにRustの勉強を始めた方、気になる方は参考にどうぞ。
HashMapとは
Rubyでいうところの連想配列のようなもので、キーと値を紐づけて保持することができます。
なお、RustではHashMapを使うにはuse std::collections::HashMap
の記述が必要になります。
let tuki = ["睦月", "如月", "弥生", "卯月", "皐月", "水無月", "文月", "葉月", "神無月", "霜月", "師走"];
// HashMapを生成
let mut tuki_map: HashMap<&str, usize> = HashMap::new();
// 月名をHashMapに変換
for(i, v) in tuki.iter().enumerate() {
// insert(key, value)
tuki_map.insert(v, i+1);
}
こちらが、和風月名をキーとしてその対応する数をHashMapにするコード。
配列tuki
に和風月名を列挙し、for
文でそれをHashMapに詰めていっているイメージです。
HashMapのキーと値の型を指定する場合はHashMap<キーの型, 値の型>
と指定します。
ここでは、キーが文字列・値は整数なので&strとisizeを指定しています。
forにあるtuki.iter().enumerate()
はイテレータが返す値とインデックスを一緒に取得できる関数です。
単純に追加していくだけだと、配列は0からスタートするためインデックスに1を追加したものを値をとしてHashMapに追加しています。
割と単純。
HashMapへのアクセスはRubyなどと同様に以下のように取得できます。
println!("{}月", tuki_map["睦月"]);
// => 1月
存在しない値へアクセスしようとするとエラーでコンパイルできません。
println!("ないデータ = {}", tuki_map["ないよ"]);
// => thread 'main' panicked at 'no entry found for key'
値の取得方法
値が存在するかどうかを確認したいときはget()
を使います。
また、match
を使って条件分岐させることも可能です。
// 存在する場合: Some(value), 存在しない場合: Noneが返ってくる
if tuki_map.get("存在しない") == None {
println!("ないよ");
}
// 別バージョン
match tuki_map.get("水無月") {
None => println!("ないよ"),
Some(v) => println!("あるよ: {}月", v),
}
なお、get()
で帰ってくるのはOption型です。
これは、値がない(None)と何か値がある(Some)の状態を表したもの。
Someの状態のときは、何らかの値があるので実際の値を得ることができます。
この時に便利なのがmatch
。
書式は以下の通り。
match Option型の値 {
None => <値がない場合の処理>,
Some(v) => <値vがあった場合の処理>
}
まとめ
今回はRustを触っているのでメモとして記載しました。
ざっくりメモなので&strってなんやねん、とかはここでは書いてません。
Rustの根幹にもかかわっているところなので後ほど出てくるかと思います。
ということで、今回はここまで。
おわり
ディスカッション
コメント一覧
まだ、コメントがありません