生成器

优质
小牛编辑
140浏览
2023-12-01

当你需要懒惰地生成一系列的值时,考虑使用一个“生成器函数” (generator function)。Dart 对这类生成器函数有内置的支持:

  • 同步的生成器:返回一个 Iterable 对象。
  • 异步的生成器:返回一个 Stream 对象。

要实现一个同步的生成器函数,使用 sync* 标记函数体,并使用 yield 语句传递值:

Iterable<int> naturalsTo(int n) sync* {
  int k = 0;
  while (k < n) yield k++;
}

要实现一个异步的生成器函数,使用 async* 标记函数体,并使用 yield 语句传递值:

Stream<int> asynchronousNaturalsTo(int n) async* {
  int k = 0;
  while (k < n) yield k++;
}

如果你的生成器是递归的,可以使用 yield* 增进它的性能:

Iterable<int> naturalsDownFrom(int n) sync* {
  if (n > 0) {
    yield n;
    yield* naturalsDownFrom(n - 1);
  }
}