Если компилятор встречает 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
ы!