Menu
Coddy logo textTech

ループ内での借用

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

次のように考えてみましょう:

  1. & を使うことは、フォトアルバムを見ているようなものです。すべての写真を見ることができますが、アルバムはそのままの状態に保たれます。
  1. & を使わないのは、写真を取り出すようなものです。それらを使うことはできますが、その後アルバムは空になってしまいます。

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

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; }

自分で試してみよう

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

quiz icon腕試し

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

Fundamentalsのすべてのレッスン