Foreach

より間違いにくく、より可読性の高い繰り返しができるDの機能であるforeachループです。

要素の反復

int[]型の配列arrがあるとき、foreachループを使って要素を 反復処理することができます:

foreach (int e; arr) {
    writeln(e);
}

foreachの最初のパラメータは繰り返し内で使われる変数名です。 その型は自動的に推論されます:

foreach (e; arr) {
    // typeof(e) は int
    writeln(e);
}

2つ目のフィールドは配列、または次のセクションで紹介される レンジと呼ばれる特殊な反復可能オブジェクトでなければいけません。

参照によるアクセス

要素は繰り返しの間に配列またはレンジからコピーされます。 これは基本型においては好ましいことですが、大きな型においては問題かもしれません。 コピーするのを防ぐ、またはインプレースの変化を有効にするには、refが使えます:

foreach (ref e; arr) {
    e = 10; // 値を上書きする
}

n回反復

Dはn回実行しなければならない繰り返しを、..文によりより簡潔に書くことができます:

foreach (i; 0..3) {
    writeln(i);
}
// 0 1 2

a..bの最後の数字はレンジから除外され、したがってループ本文は3回実行されます。

インデックスカウンタ付きの繰り返し

配列において、また別のインデックス変数にアクセスすることもできます。

foreach (i, e; [4, 5, 6]) {
    writeln(i, ":", e);
}
// 0:4 1:5 2:6

foreach_reverseによる逆向きの繰り返し

コレクションはforeach_reverseにより逆順で繰り返すことができます:

foreach_reverse (e; [1, 2, 3]) {
    writeln(e);
}
// 3 2 1

掘り下げる

rdmd playground.d