Menu
Coddy logo textTech

ループ内での借用

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);
// これはエラーになります

次のように考えてみてください:

  1. & を使うのは、フォトアルバムを眺めるようなものです:すべての写真を見ることができますが、アルバムはそのまま残ります
  2. & を使わないのは、写真を取り出すようなものです:写真を使うことはできますが、その後アルバムは空になります

次は、このスタイルです:

for num in numbers.iter() {}

次と同様です:

for num in &numbers {}

そして、値を変更するループです:

for num in numbers.iter_mut() { 
    *num *= 2;
}

次のように書くこともできます:

for num in &mut numbers { 
    *num *= 2;
}

自分で試してみよう

このレッスンにはコードチャレンジは含まれていません。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Fundamentalsのすべてのレッスン