値へのアクセス
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 30/66。
ハッシュマップにデータを格納したら、それを取り出す方法が必要になります。.get()メソッドを使用すると、キーを使って値を検索できます:
let value = my_map.get("some_key");しかし、理解しておくべき重要な詳細があります。.get() は値を直接返すわけではありません。代わりに、Option 型を返します。これは、値が存在する(Some)か、存在しない(None)かのいずれかを表す Rust の組み込み型です。これは、探しているキーがハッシュマップ内に存在しない可能性があるためです。
キーが存在する場合、.get() は Some(&value) を返します。& 記号に注目してください。これは値への参照を取得することを意味します。キーが存在しない場合は、None を返します。
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}Some(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
チートシート
.get()メソッドは、キーを使用してハッシュマップから値を取得します:
let value = my_map.get("some_key");キーがハッシュマップに存在しない可能性があるため、.get()メソッドはOption型を返します:
- キーが存在する場合:
Some(&value)(値への参照)を返します - キーが存在しない場合:
Noneを返します
両方のケースを処理するには、matchを使用します:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}この設計は、両方の可能性を処理することを強制することで、存在しないキーにアクセスした際のクラッシュを防ぎます。
自分で試してみよう
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を作成し、国と首都を挿入してから、国を検索します
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。