Menu

Диапазоны

Если компилятор встречает foreach

foreach(element; range) {

он внутри заменяется на код, подобный этому:

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

Любой объект, поддерживающий такой интерфейс, называется range (диапазон) и, таким образом, является типом, который можно перебирать:

struct Range {
    @property empty() const;
    void popFront();
    T front();
}

Функции в std.range и std.algorithm предоставляют строительные блоки, которые используют этот интерфейс. Диапазоны позволяют комбинировать сложные алгоритмы, объединяя их в один объект, который можно легко обойти в цикле. Более того, диапазоны позволяют создавать ленивые объекты, которые выполняют вычисления только когда это действительно необходимо при переборе (например, при доступе к следующему элементу диапазона). Особый алгоритм диапазонов будет представлен позже в разделе D's Gems.

Упражнение

Завершите код, чтобы создать FibonacciRange диапазон, который возвращает числа Последовательности Фибоначчи. Не занимайтесь самообманом, удаляя assertы!

Подробнее

rdmd playground.d