ループ内での借用
CoddyのRustジャーニー「Fundamentals」セクションの一部 — レッスン 67/75。
Rustでは、すべての値に所有者(owner)が存在します。ループ内で値を使用する場合、Rustはその値を借用(borrow)したいのか(一時的に参照するだけなのか)、それとも所有権を取得(take ownership)したいのか(消費するのか)を判断する必要があります。
これは重要です。なぜなら、ループがデータの所有権を取得すると、ループ終了後にそのデータを使用できなくなるからです。この違いを理解することが、Rustでループを正しく記述するための鍵となります。
例えば、次のデータを考えてみましょう:
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;
}自分で試してみよう
このレッスンにはコードチャレンジは含まれていません。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。