Дiапазони

Коли компiлятор зустрічає вираз foreach

foreach(element; range) {

вiн на нижчому рівні перепиcує його в:

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

Будь-який об'єкт, який імплементує вищезгаданий інтерфейс, називається діапазон і може пiдтримувати ітерації:

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

Функції у std.range і std.algorithm забезпечують будівельні блоки, які використовують цей інтерфейс. Діапазони дозволяють створювати складні алгоритми обробки об'єктiв, по яким може бути проведена ітерація. Крім того, діапазони дозволяють створювати ледачi об'єкти, які виконують обчислення тільки, коли це дійсно необхідно, наприклад, коли наступний елемент діапазону є реально доступним. Спецiальнi алгоритми для діапазонiв будуть описані пізніше у розділі Коштовності D.

Вправа

Завершіть код та створіть дiапазон FibonacciRange, який повертає числа Фібоначчі. Не вводьте себе в оману, видаляючи assert-и!

Додатково

rdmd playground.d