Порождение элементов в Dart
Не каждая цепочка начинается с готовой
коллекции. Функция с sync* и yield
выдает элементы по одному: локальная переменная
хранит текущее значение, а тело цикла задает
следующий шаг.
Старт с единицы и шаг плюс один дают натуральный ряд. Без ограничения длины пример не закончился бы, поэтому сразу возьмем первые пять чисел:
Iterable<int> naturals(int n) sync* {
while (true) {
yield n;
n = n + 1;
}
}
final picked = naturals(1).take(5).toList();
print(picked);
Тот же механизм подходит для геометрической прогрессии: текущее значение умножается на два на каждом шаге:
Iterable<int> powers(int n) sync* {
while (true) {
yield n;
n = n * 2;
}
}
final powersList = powers(1).take(4).toList();
print(powersList);
Метод take здесь обязателен: иначе конечное действие
пыталось бы пройти бесконечный ряд. Ограничение
длины обрывает генерацию, когда набрано нужное
число элементов.
Постройте генератор от 10 с шагом
минус три. Возьмите первые четыре значения и
выведите список.
Семя 3, каждый следующий элемент -
удвоение предыдущего. Возьмите первые пять
значений и выведите список.