同步生成器
yield
会等待moveNext
指令
dart
Iterable<int> test(int n) sync* {
print('start');
int k = 0;
while (k < n) {
yield k++;
}
print('end');
}
var it = test(10).iterator;
while (it.moveNext()) {
print(it.current);
}
异步生成器
以流的方式一次性推送,
StreamSubscription
对象进行流的监听控制
dart
import 'dart:async';
Stream<int> test(int n) async* {
print('start');
int k = 0;
while (k < n) {
yield k++;
}
print('end');
}
test(10).listen((event) {
print(event);
});
// 或者
StreamSubscription subscription = test(10).listen(null);
subscription.onData((data) {
print(data);
});
递归生成器
yield*
以指针的方式传递递归对象,而不是整个同步对象
dart
Iterable<int> test(int n) sync* {
if (n > 0) {
yield n;
yield* test(n - 1);
}
}
var it = test(10).iterator;
while (it.moveNext()) {
print(it.current);
}