ループ内での借用
CoddyのRustジャーニー「Fundamentals」セクションの一部 — レッスン 67/75。
Rustでループを書くとき、データを使用する主な方法が2つあります。データを見る(&を使用する)か、データを取得するかです。例えば、以下のデータを考えてみましょう。
let numbers = vec![1, 2, 3, 4, 5];
let mut sum = 0;方法 1: データを参照する (& を使用):
for number in &numbers {
sum += number;
}
println!("I can use it here: {:?}", numbers);方法 2: データの取得 (& なし):
for number in numbers {
sum += number;
}
// println!("Can't use {:?} anymore!", numbers);
// これはエラーになります次のように考えてみましょう:
&を使うことは、フォトアルバムを見ているようなものです。すべての写真を見ることができますが、アルバムはそのままの状態に保たれます。
&を使わないのは、写真を取り出すようなものです。それらを使うことはできますが、その後アルバムは空になってしまいます。
次に、このスタイルです:
for num in numbers.iter() {}次と同様です:
for num in &numbers {}そして、ミューテーションループです:
for num in numbers.iter_mut() {
*num *= 2;
}次のように書くこともできます:
for num in &mut numbers {
*num *= 2;
}チートシート
Rustのループでは、データを見る(&を使用)か、その所有権を取得するかのいずれかを行うことができます:
データを見る(借用):
let numbers = vec![1, 2, 3, 4, 5];
for number in &numbers {
sum += number;
}
// ループの後でもnumbersは引き続き使用できます所有権を取得する:
let numbers = vec![1, 2, 3, 4, 5];
for number in numbers {
sum += number;
}
// ループの後ではnumbersは使用できませんイテレータメソッド:
// これらは同等です:
for num in numbers.iter() {}
for num in &numbers {}
// 変更(ミューテーション)の場合:
for num in numbers.iter_mut() { *num *= 2; }
for num in &mut numbers { *num *= 2; }自分で試してみよう
このレッスンにはコードチャレンジは含まれていません。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。