Оператор yield
Оператор yield используется внутри
функции-генератора и возвращает очередное
значение последовательности. Функция-генератор
объявляется с ключевым словом sync*
или async*. При каждом вызове
yield выполнение функции приостанавливается,
а значение передается наружу. Когда потребитель
запрашивает следующий элемент, выполнение
продолжается с того места, где оно было прервано.
В отличие от return, оператор yield
не завершает функцию, а лишь отдает одно значение
из последовательности.
Синтаксис
Iterable<Type> functionName() sync* {
yield value;
}
Пример
Давайте создадим генератор, который поочередно
возвращает числа от 1 до 5:
Iterable<int> numbers() sync* {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
}
void main()
{
print(numbers().toList());
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Пример
Давайте используем yield внутри цикла
for, чтобы вернуть элементы списка:
Iterable<String> letters() sync* {
List<String> list = ['a', 'b', 'c', 'd', 'e'];
for (String item in list) {
yield item;
}
}
void main()
{
print(letters().toList());
}
Результат выполнения кода:
[a, b, c, d, e]
Пример
Давайте переберем значения генератора
с помощью цикла for-in:
Iterable<int> numbers() sync* {
for (int i = 1; i <= 5; i++) {
yield i;
}
}
void main()
{
for (int num in numbers()) {
print(num);
}
}
Результат выполнения кода:
1
2
3
4
5
Пример
Давайте создадим асинхронный генератор
с помощью async* и yield,
возвращающий строки:
Stream<String> strings() async* {
yield 'abcde';
yield '12345';
}
void main() async {
await for (String str in strings()) {
print(str);
}
}
Результат выполнения кода:
"abcde"
"12345"