Foreach

D apresenta um loop foreach que permite iteração menos propensa a erros e mais legível.

Iteração dos elementos

Dado um array arr do tipo int[], é possível iterar sobre os elementos usando um loop foreach:

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

O primeiro parâmetro em um loop foreach é o nome da variável usada para cada iteração. Seu tipo pode ser inferido automaticamente da seguinte forma:

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

O segundo campo deve ser um array - ou um objeto iterável especial chamado range, que será apresentado na próxima seção.

Acessando por referência

Os elementos serão copiados do array ou range durante a iteração. Isso é aceitável para tipos básicos, mas pode ser um problema para tipos tipos grandes. Para evitar a cópia e permitir a mutabilidade do dado pode ser usado o ref:

foreach (ref e; arr) {
    e = 10; // sobrescrevendo o valor
}

Iterar n vezes

D nos permite escrever iterações que devem ser executadas n vezes, de forma mais concisa com a sintaxe ..:

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

O último número em a ... b é excluído do intervalo, portanto, o corpo do loop é executado 3 vezes.

Iteração com contador de índice

Para arrays, também é possível acessar uma variável de índice separada.

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

Iteração reversa com foreach_reverse

Um array pode ser iterada na ordem inversa com foreach_reverse:

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

Maiores detalhes

rdmd playground.d