范围

如果编译器遇到 foreach

foreach (element; range) {

它在内部重写类似于以下内容:

for (auto it = range; !it.empty; it.popFront()) {
    auto element = it.front;
    ...
}

任何满足上述接口的对象都称为输入范围,因此是可以迭代的类型:

struct InputRange {
    @property bool empty();
    @property T front();
    void popFront();
}