Бесконечный генератор в Dart
Генератор с sync* может крутить while (true)
и выдавать yield на каждом витке. Если длину
не ограничить, полный обход такого Iterable
не завершился бы.
Счетчик в локальной переменной растет на каждом
вызове. Конечное действие без take здесь
опасно - обход не завершился бы:
Iterable<int> endless() sync* {
int n = 0;
while (true) {
yield n;
n = n + 1;
}
}
final head = endless().take(6).toList();
print(head);
Метод take отрезает конечный кусок, и только
после этого toList материализует шесть
значений. Исходный генератор при этом
остается бесконечным в описании.
Тот же прием с начальным значением и правилом плюс один: ряд не ограничен, но наружу уходит только часть:
Iterable<int> fromHundred(int n) sync* {
while (true) {
yield n;
n = n + 1;
}
}
final window = fromHundred(100)
.where((n) => n % 10 == 0)
.take(3)
.toList();
print(window);
С помощью sync* выдайте нечетные числа
начиная с 1 через локальный счетчик.
Возьмите первые пять и выведите список.
Постройте бесконечный ряд степеней двойки от
1. Оставьте только значения не больше
64, возьмите не более четырех элементов
и выведите их сумму.