Оператор yield*
Оператор yield* используется внутри
функции-генератора и делегирует выдачу
значений другому генератору. В отличие от
обычного yield, который выдаёт одно
значение, yield* передаёт управление
целому генератору (например, другой функции
с sync* или async*), и все
значения из него попадают в итоговую
последовательность. Оператор не принимает
параметров, а справа от него указывается
выражение, возвращающее Iterable
или Stream.
Синтаксис
yield* iterable;
Пример
Давайте создадим генератор, который делегирует выдачу значений другому генератору:
Iterable<int> inner() sync* {
yield 1;
yield 2;
yield 3;
}
Iterable<int> outer() sync* {
yield 0;
yield* inner();
yield 4;
}
void main()
{
print(outer().toList());
}
Результат выполнения кода:
[0, 1, 2, 3, 4]
Пример
Давайте делегируем генерацию прямо из списка, не создавая отдельную функцию:
Iterable<String> gen() sync* {
yield 'abcde';
yield* ['12345', 'hello'];
yield 'world';
}
void main()
{
print(gen().toList());
}
Результат выполнения кода:
["abcde", "12345", "hello", "world"]
Пример
Давайте применим yield* в
асинхронном генераторе:
Stream<int> inner() async* {
yield 1;
yield 2;
}
Stream<int> outer() async* {
yield* inner();
yield 3;
}
void main() async
{
await for (int value in outer()) {
print(value);
}
}
Результат выполнения кода:
1
2
3