より間違いにくく、より可読性の高い繰り返しができる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