Foreach

En D, on peut utiliser les boucles foreach qui sont plus lisibles et réduisent les possibilités d'erreurs.

Itération sur des éléments

Avec un tableau tab de type int[], il est possible d'itérer sur ses éléments en utilisant une boucle foreach :

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

Le premier champ de l'appel à foreach est le nom de la variable qui sera utilisée dans l'itération. Son type peut être déduit automatiquement :

foreach(e; tab)
{
    assert(typeof(e).stringof == "int"); // e est un int
}

Le second champ doit être un tableau, ou un objet spécial sur lequel on peut itérer, qu'on appelle range et qu'on introduira dans le prochain chapitre.

Accès par référence

Les éléments seront copiés depuis le tableau ou la range pendant l'itération. C'est acceptable pour des types fondamentaux mais peut devenir très problématique pour des types plus grands. Pour empêcher la copie ou pour pouvoir modifier les éléments dans la boucle, ref peut être utilisé :

foreach(ref e; tab)
{
    e = 10; // overwrite value
}

Itérer n fois

D permet d'écrire des boucles qui doivent être exécutées n fois de manière concise avec la syntaxe .. :

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

Le dernier nombre dans a..b est exclu de l'intervalle, cette boucle est donc éxecutée 3 fois.

Itération avec compteur d'index

Pour les tableaux, il est également possible d'accéder à l'index en le stockant dans une variable :

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

Itération inversée avec foreach_reverse

On peut itérer sur une collection à l'envers avec foreach_reverse:

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

Pour aller plus loin

rdmd playground.d