値へのアクセス
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 30/66。
ハッシュマップにデータを格納したら、それを取り出す方法が必要になります。.get()メソッドを使用すると、キーを使って値を検索できます。
let value = my_map.get("some_key");しかし、理解しておくべき重要な詳細があります:.get() は値を直接返すわけではありません。代わりに、Option 型を返します。これは「何か」または「何もない」のいずれかを表す、Rustの組み込み型です。これは、探しているキーがハッシュマップ内に存在しない可能性があるためです。
キーが存在する場合、.get() は Some(&value) を返します。& 記号に注目してください。これは、値そのものではなく、値への参照を取得することを意味します。キーが存在しない場合、None を返します:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}match アームが明示的な & なしで Some(capital) を使用していることに気づくかもしれません。これは、このコンテキストでは Rust が自動的に参照を処理するためです。capital は依然として値への参照を保持していますが、パターン内に明示的に & を書く必要はありません。Rust のパターンマッチングは十分にスマートなので、例えば出力する際などに capital を直接使用することができます。
この設計により、存在しないキーにアクセスしようとしたときにプログラムがクラッシュするのを防ぐことができます。エラーを発生させる代わりに、Rustは値が見つかる場合と見つからない場合の両方の可能性を処理することを強制します。これにより、コードがより堅牢で予測可能になります。
チャレンジ
簡単2つの入力(国名と首都名)を受け取ります。国名をキー(型は String)、首都を値(型は String)として保存するハッシュマップを作成してください。国とその首都をハッシュマップに挿入します。次に、検索対象の別の国名として3つ目の入力を受け取ります。.get() メソッドを使用してこの国の首都を取得し、その国がマップに存在する場合と存在しない場合の両方のケースを処理してください。
注意:.get() は Option を返します。キーが存在する場合は Some(&value)(値への参照)、存在しない場合は None です。match アーム内では Some(capital) と記述でき、Rustが自動的に参照を処理するため、プリント文で capital を直接使用できます。
要件:
std::collectionsからHashMapをインポートするHashMap<String, String>型の可変(mutable)なハッシュマップを作成する- 1つ目の入力を国名として読み込む
- 2つ目の入力を首都名として読み込む
- 国と首都をハッシュマップに挿入する
- 3つ目の入力を検索対象の国として読み込む
.get()を使用して検索対象の国の首都を取得するmatchを使用して.get()から返されたOptionを処理する- 国が見つかった場合は、次のように出力する:
The capital of [country] is [capital] - 国が見つからない場合は、次のように出力する:
[country] not found in the map
入力:
- 1行目:挿入する国名(例:
France) - 2行目:首都名(例:
Paris) - 3行目:検索対象の国名(例:
FranceまたはGermany)
出力:
- 検索対象の国が存在する場合:
The capital of [country] is [capital] - 検索対象の国が存在しない場合:
[country] not found in the map
自分で試してみよう
use std::collections::HashMap;
use std::io;
fn main() {
// 挿入する国名を読み込む
let mut country = String::new();
io::stdin().read_line(&mut country).expect("Failed to read line");
let country = country.trim().to_string();
// 首都名を読み込む
let mut capital = String::new();
io::stdin().read_line(&mut capital).expect("Failed to read line");
let capital = capital.trim().to_string();
// 検索する国名を読み込む
let mut lookup_country = String::new();
io::stdin().read_line(&mut lookup_country).expect("Failed to read line");
let lookup_country = lookup_country.trim().to_string();
// TODO: 以下にコードを記述してください
// HashMap を作成し、国と首都を挿入してから、その国を検索します
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。