foreach
D cuenta con el bucle foreach
, que permite realizar iteraciones más legibles
y menos propensas a errores.
Dado el array arr
de tipo int[]
, es posible iterar sobre sus elementos
usando el bucle foreach
:
foreach (int e; arr) {
writeln(e);
}
El primer campo dentro de la definición del bucle foreach
es el nombre de la
variable usada en la iteración. Si no se indica su tipo, este se deduce
automáticamente:
foreach (e; arr) {
// typeof(e) es int
writeln(e);
}
El segundo campo debe ser un array, aunque también puede ser un tipo de datos especial que sea iterable llamado rango (range en inglés), que se verá en la siguiente sección.
Durante la iteración, los elementos del array son copiados. Esto es aceptable
para tipos de datos básicos, pero podría ser un problema para tipos de datos
grandes. Para prevenir esta copia y/o para habilitar la edición de los datos
dentro del propio bucle, se usa la palabra reservada ref
:
foreach (ref e; arr) {
e = 10; // se sobreescribe el valor
}
n
vecesD permite escribir iteraciones que son ejecutadas n
veces de forma más
precisa mediante la sintaxis ..
:
foreach (i; 0 .. 3) {
writeln(i);
}
// imprimirá 0 1 2
El último número del rango a .. b
se excluye del mismo, por lo que el cuerpo
del bucle del ejemplo se ejecutará sólo 3 veces.
Para los arrays también es posible acceder al índice de cada elemento a través de otra variable diferente:
foreach (i, e; [4, 5, 6]) {
writeln(i, ":", e);
}
// imprimirá 0:4 1:5 2:6
foreach_reverse
Una coleción puede ser iterada en orden inverso mediante foreach_reverse
:
foreach_reverse (e; [1, 2, 3]) {
writeln(e);
}
// imprimirá 3 2 1