生成器
同步生成器
void main() {
print('main start');
Iterator iterator = syncGenerator(5).iterator;
while (iterator.moveNext()) {
print(iterator.current);
}
print('main end');
}
// 同步生成器
Iterable<int> syncGenerator(int n) sync*{
print('start');
int i = n;
while(i > 0) {
print('generator: $i');
yield i-- ; // yield 產出結果
}
print('end');
}
異步生成器
void main() {
print('main start');
StreamSubscription subscription = asyncGenerator(5).listen(null);
subscription.onData((handleData) {
print(handleData);
if (handleData > 1) { // 異步生成器可以被中斷
subscription.pause();
}
});
// StreamSubscription subscription = asyncGenerator(5).listen((value) {
// print('sub $value');
// });
print('main end');
}
// 異步生成器
Stream<int> asyncGenerator(int n) async*{
print('start');
int i = 0;
while(i < n){
print('generator: $i');
yield i++; // yield 產出結果
}
print('end');
}
yield 與 yield*
- yield 直接輸出結果
- yield* 輸出一個函數指針, 也就是說實際將會執行yield* 所表示的函數
遞歸生成器
void main() {
print('main start');
// 遞歸生成器
Iterator iterator = getSyncRecursiveGenerator(5).iterator;
while (iterator.moveNext()){
print(iterator.current);
}
print('main end');
}
// 遞歸生成器
Iterable<int> getSyncRecursiveGenerator(int n) sync* {
if (n > 0) {
yield n; // yield 產出結果
yield* getSyncRecursiveGenerator(n - 1); // yield* 調用函數
}
}