D 有一个特性 foreach 循环,以获得更少错误、可读性更高的迭代。
给定一个 int[] 类型的数组 arr ,可以使用 foreach 循环遍历元素:
foreach (int e; arr) {
writeln(e);
}
foreach 循环的第一个字段是每次迭代的变量名。类型是可以自动推断的:
foreach (e; arr) {
// typeof(e) 是 int 类型
writeln(e);
}
第二个字段必须是一个数组 - 或者一个称为 range 范围 的特殊可迭代对象,下节将会介绍。
每个元素在数组迭代时会被拷贝。通常对于基础类型是可以接受的,但对于大的类型可能会有问题。
为了防止复制或者需要 直接 修改,可以使用 ref:
foreach (ref e; arr) {
e = 10; // overwrite value
}
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