値へのアクセス
CoddyのRustジャーニー「論理とフロー」セクションの一部。レッスン 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つの入力を受け取ります。country 名と capital city 名です。country 名をキー(型 String)として、capital city を値(型 String)として格納するハッシュマップを作成します。country とその capital をハッシュマップに挿入します。次に、検索する別の country 名を含む3つ目の入力を受け取ります。.get() メソッドを使用してこの country の capital を取得し、country が map に存在する場合と存在しない場合の両方を処理します。
注: .get() は Option を返します。キーが存在する場合は Some(&value)(値への参照)を、存在しない場合は None を返します。match アームでは Some(capital) と記述でき、Rust が参照を自動的に処理するため、print 文で capital を直接使用できます。
要件:
HashMapをstd::collectionsからインポートする- 型
HashMap<String, String>の可変ハッシュマップを作成する - 1つ目の入力を country 名として読み取る
- 2つ目の入力を capital city 名として読み取る
- country と capital をハッシュマップに挿入する
- 3つ目の入力を検索対象の country として読み取る
.get()を使用して検索対象 country の capital を取得するmatchを使用して.get()が返すOptionを処理する- country が見つかった場合、
The capital of [country] is [capital]と出力する - country が見つからない場合、
[country] not found in the mapと出力する
入力:
- 1行目: 挿入する country 名(例:
France) - 2行目: capital city 名(例:
Paris) - 3行目: 検索する country 名(例:
FranceまたはGermany)
出力:
- 検索対象 country が存在する場合:
The capital of [country] is [capital] - 検索対象 country が存在しない場合:
[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を作成し、国と首都を挿入してから、国を検索する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: Rustオンラインコンパイラ