範圍

如果編譯器遇到 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();
}