创建一个新的输入范围类型

InputRange 概念有三个功能,例如:

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

总之,一种方式

  1. 检查范围是否为空
  2. 获取当前元素
  3. 转到下一个元素

要使我们自己的类型成为 InputRange,我们必须实现这三个功能。让我们来看看无限的正方形序列。

struct SquaresRange {
    int cur = 1;

    @property bool empty() {
        return false;
    }

    @property int front() {
        return cur^^2;
    }

    void popFront() {
        cur++;
    }
}

有关斐波那契的例子,请参阅 D 之旅