Модификатор sync*
Модификатор sync* ставится после списка параметров
функции и превращает её в синхронный генератор.
Такая функция возвращает объект типа Iterable,
а не обычное значение. Внутри неё можно использовать
оператор yield, который отдаёт очередное значение
генератора. Значения вычисляются лениво: код функции
выполняется только тогда, когда потребитель запрашивает
следующий элемент. Это удобно для создания
последовательностей, которые не нужно хранить в памяти
целиком.
Синтаксис
Iterable<T> functionName(parameters) sync* {
yield value;
}
Пример
Давайте создадим синхронный генератор, который
поочерёдно отдаёт числа от 1 до 5:
Iterable<int> numbers() sync* {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
}
void main()
{
for (int num in numbers()) {
print(num);
}
}
Результат выполнения кода:
1
2
3
4
5
Пример
Давайте создадим синхронный генератор, который принимает строку и отдаёт её символы по одному:
Iterable<String> chars(String str) sync* {
for (int i = 0; i < str.length; i++) {
yield str[i];
}
}
void main()
{
for (String ch in chars('abcde')) {
print(ch);
}
}
Результат выполнения кода:
"a"
"b"
"c"
"d"
"e"
Пример
Давайте соберём все значения синхронного генератора
в список с помощью метода toList:
Iterable<int> numbers() sync* {
yield 1;
yield 2;
yield 3;
}
void main()
{
List<int> res = numbers().toList();
print(res);
}
Результат выполнения кода:
[1, 2, 3]