Skip to content
当前页大纲

同步生成器

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);
}

MIT License.