for、while、および loop 式を使用する

完了

多くの場合、プログラムには、その場で繰り返す必要があるコードのブロックがあります。 ループ式を使用して、繰り返しの実行方法をプログラムに指示できます。 電話帳のすべてのエントリを出力するには、ループ式を使用して、最初のエントリから最後のエントリまでを出力する方法をプログラムに指示できます。

Rust には、プログラムがコードのブロックを繰り返すようにする 3 つのループ式が用意されています。

  • loop: 手動で停止されない限り、繰り返します。
  • while: 条件が true の間は繰り返します。
  • for: コレクション内のすべての値に対して繰り返します。

このユニットでは、これらの各ループ式について見ていきます。

単純にループを続ける

loop 式では、無限ループが作成されます。 このキーワードを使用すると、式本体のアクションを継続的に繰り返すことができます。 アクションは、ループを停止する直接アクションを実行するまで繰り返されます。

次の例では "We loop forever!" というテキストが出力されます。自動的に停止することはありません。 println! アクションが繰り返され続けます。

loop {
    println!("We loop forever!");
}

loop 式を使用する場合、ループを停止する唯一の方法は、プログラマが直接介入することです。 特定のコードを追加してループを停止させることができます。または、Ctrl+C などのキーボード命令を入力して、プログラムの実行を停止することもできます。

loop 式を停止する最も一般的な方法は、break キーワードを使用してブレーク ポイントを設定することです。

loop {
    // Keep printing, printing, printing...
    println!("We loop forever!");
    // On the other hand, maybe we should stop!
    break;                            
}

プログラムによって break キーワードが検出されると、loop 式の本体内のアクションの実行が停止され、次のコード ステートメントに進みます。

break キーワードは、loop 式の特殊な機能を示します。 break キーワードを使用すると、式本体内のアクションの繰り返しを停止でき、ブレーク ポイントで値を返すこともできます。

次の例は、loop 式で break キーワードを使用して、値も返す方法を示しています。

let mut counter = 1;
// stop_loop is set when loop stops
let stop_loop = loop {
    counter *= 2;
    if counter > 100 {
        // Stop loop, return counter value
        break counter;
    }
};
// Loop should break when counter = 128
println!("Break the loop at counter = {}.", stop_loop);

出力は次のようになります。

Break the loop at counter = 128.

loop 式の本体では、これらの連続したアクションが実行されます。

  1. 変数 stop_loop を宣言します。
  2. 変数の値を loop 式の結果にバインドするようにプログラムに指示します。
  3. ループを開始します。 loop 式の本体内のアクションを実行します。
    ループ本体
    1. counter 値を現在の値の 2 倍にインクリメントします。
    2. counter 値を確認します。
    3. counter 値が 100 を超える場合:

      ループを中断し、counter 値を返します。

    4. counter 値が 100 以下の場合:

      ループ本体でアクションを繰り返します。

  4. stop_loop 値を、loop 式の結果である counter 値に設定します。

loop 式本体には複数のブレーク ポイントを含めることができます。 式に複数のブレーク ポイントがある場合は、すべてのブレーク ポイントから同じ型の値が返される必要があります。 すべての値が整数型、文字列型、ブール型などである必要があります。 ブレーク ポイントによって値が明示的に返されない場合、プログラムでは式の結果が空のタプル () として解釈されます。

while ループ

while ループでは、条件式が使用されます。 ループは、条件式が true のままである限り繰り返されます。 このキーワードを使用すると、条件式が false になるまで式本体内のアクションを実行できます。

while ループは、ブール型のループ条件式を評価することによって開始されます。 条件式が true と評価された場合は、本体内のアクションが実行されます。 アクションが完了すると、制御が条件式に戻ります。 条件式が false に評価された場合、while 式は停止します。

次の例では、"We loop a while..." というテキストが出力されます。 ループが繰り返されるたびに "カウントが 5 より小さい" という条件がテストされます。条件が true のうちは式本体のアクションが実行されます。 条件が true でなくなると、while ループが停止し、プログラムは次のコード ステートメントに進みます。

while counter < 5 {
    println!("We loop a while...");
    counter = counter + 1;
}

これらの値のループ

for ループでは、反復子を使用して項目のコレクションが処理されます。 ループでは、コレクション内の各項目について、式本体内のアクションが繰り返されます。 この種類のループの繰り返しは "反復処理" と呼ばれます。 すべての反復処理が完了すると、ループが停止します。

Rust では、配列、ベクター、ハッシュ マップなど、任意のコレクション型を反復処理できます。 Rust では、"反復子" を使用して、コレクション内の各項目の最初から最後まで移動します。

for ループでは、反復子として一時変数が使用されます。 変数はループ式の先頭で暗黙的に宣言され、現在の値は各反復処理で設定されます。

次のコードでは、コレクションは big_birds 配列で、反復子の名前は bird です。

let big_birds = ["ostrich", "peacock", "stork"];
for bird in big_birds

コレクション内の項目にアクセスするには、iter() メソッドを使用します。 for 式により、反復子の現在の値が iter() メソッドの結果にバインドされます。 式本体では、反復子の値を操作できます。

let big_birds = ["ostrich", "peacock", "stork"];
for bird in big_birds.iter() {
    println!("The {} is a big bird.", bird);
}

出力は次のようになります。

The ostrich is a big bird.
The peacock is a big bird.
The stork is a big bird.

反復子を作成するもう 1 つの簡単な方法は、範囲表記 a..b を使用することです。 反復子は a 値から開始し、1 つのステップで b に進みますが、値 b は使用しません。

for number in 0..5 {
    println!("{}", number * 2);
}

このコードでは、0、1、2、3、および 4 の数値が反復処理されます。 ループの反復ごとに値が number 変数にバインドされます。

出力は次のようになります。

0
2
4
6
8

この Rust Playground 内で、このコードを実行してループを調べることができます。

自分の知識をチェックする

次の質問に答えて、学習した内容を確認してください。 質問ごとに回答を 1 つ選択して、[回答を確認] を選択します。

1.

コレクション内のすべてのデータが確実に処理されるようにするには、どのような種類の反復が最適ですか?

2.

どのキーワードを指定すると、loop 式が終了しますか?