ベクタ要素へのアクセス
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 10/66。
ベクタに要素が含まれたら、個々の値にアクセスする必要があります。Rustはベクタから要素を取得するための2つの異なるアプローチを提供しており、それぞれに利便性と安全性のトレードオフがあります。
最初の方法は、配列と同様に、角括弧を使用したインデックス構文を使用します:
let numbers = vec![10, 20, 30, 40];
let first = numbers[0]; // 10を取得
let third = numbers[2]; // 30を取得この構文は馴染み深く簡潔ですが、重大なリスクがあります。存在しないインデックスにアクセスしようとすると、プログラムはパニックを起こしてクラッシュします:
let numbers = vec![10, 20, 30];
let invalid = numbers[5]; // これはパニックを起こします!2番目の方法は、安全なアクセスを提供する.get()メソッドを使用します:
let numbers = vec![10, 20, 30, 40];
let first = numbers.get(0); // Some(10)を返す
let invalid = numbers.get(5); // Noneを返す.get()メソッドはOptionを返します。これは、インデックスが存在すればSome(value)を、存在しなければNoneを返すというものです。これにより、要素が存在しない可能性を処理することが強制され、クラッシュを防ぎ、コードの堅牢性が向上します。
チャレンジ
簡単ベクタ numbers とインデックス idx を受け取り、安全なアクセスを使用してそのインデックスの要素を返す関数 get_element_at を作成してください。
要素に安全にアクセスするために .get() メソッドを使用してください。インデックスが存在する場合はその値を返し、存在しない場合はデフォルト値として -1 を返してください。
引数:
numbers(Vec<i32>): アクセスするベクタidx(i32): 取得するインデックス
戻り値: 指定されたインデックスの要素、またはインデックスが存在しない場合は -1 (i32)
チートシート
Rustはベクタの要素にアクセスするための2つのメソッドを提供しています:
角括弧を使用したインデックス構文:
let numbers = vec![10, 20, 30, 40];
let first = numbers[0]; // 10を取得
let third = numbers[2]; // 30を取得このメソッドは、インデックスが存在しない場合にパニックを引き起こします:
let invalid = numbers[5]; // これはパニックします!安全なアクセスのための.get()メソッド:
let numbers = vec![10, 20, 30, 40];
let first = numbers.get(0); // Some(10)を返す
let invalid = numbers.get(5); // Noneを返す.get()メソッドはOption型を返します。インデックスが存在する場合はSome(value)を、存在しない場合はNoneを返します。これによりクラッシュを防ぎ、欠落している要素の明示的な処理が必要になります。
自分で試してみよう
fn get_element_at(numbers: Vec<i32>, idx: i32) -> i32 {
// ここにコードを書いてください
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。