返回

Dart 中生成器:全面解析

前端

Dart 中的生成器

Dart 中的生成器是一种用于创建值序列的特殊函数。它允许开发者使用更简洁、更具表达性的方式来生成数据,同时提高代码的可读性和可维护性。

生成器函数使用 yield 来生成值。当调用生成器函数时,它会返回一个生成器对象,该对象实现了 Iterable 接口。我们可以通过迭代生成器对象来访问生成的每一个值。

同步生成器

同步生成器是生成器函数的一种,它以同步方式生成值。这意味着它会在生成每个值之前等待前一个值被消费。同步生成器函数使用关键字 yield 来生成值。

以下是同步生成器函数的示例:

Iterable<int> generateNumbers(int n) sync* {
  for (int i = 0; i < n; i++) {
    yield i;
  }
}

void main() {
  for (int number in generateNumbers(5)) {
    print(number);
  }
}

上面的示例中,generateNumbers 函数是一个同步生成器函数,它使用 yield 关键字来生成一组从 0 到 n-1 的整数。然后,我们在 main 函数中迭代这个生成器对象,并打印生成的每个数字。

异步生成器

异步生成器是生成器函数的另一种类型,它以异步方式生成值。这意味着它可以在生成下一个值之前挂起,而不会阻塞当前线程。异步生成器函数使用关键字 asyncyield 来生成值。

以下是异步生成器函数的示例:

Stream<int> generateNumbersAsync(int n) async* {
  for (int i = 0; i < n; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

void main() async {
  await for (int number in generateNumbersAsync(5)) {
    print(number);
  }
}

上面的示例中,generateNumbersAsync 函数是一个异步生成器函数,它使用 asyncyield 关键字来生成一组从 0 到 n-1 的整数。然后,我们在 main 函数中异步迭代这个生成器对象,并打印生成的每个数字。

需要注意的是,异步生成器函数只能用于生成 Stream 对象。

Stream 和 Iterable

StreamIterable 是 Dart 中用于表示值序列的两个接口。Stream 接口表示一个异步值序列,而 Iterable 接口表示一个同步值序列。

生成器函数可以返回 Stream 对象或 Iterable 对象。同步生成器函数返回 Iterable 对象,而异步生成器函数返回 Stream 对象。

yield 和 yield*

yield 关键字用于生成单个值,而 yield* 关键字用于生成另一个生成器函数生成的值。

例如,以下示例演示如何使用 yield* 关键字来生成斐波那契数列:

Iterable<int> fibonacci() sync* {
  int a = 0, b = 1;
  while (true) {
    yield a;
    int temp = a;
    a = b;
    b = temp + b;
  }
}

void main() {
  for (int number in fibonacci()) {
    print(number);
    if (number > 100) {
      break;
    }
  }
}

上面的示例中,fibonacci 函数是一个同步生成器函数,它使用 yieldyield* 关键字来生成斐波那契数列。我们可以在 main 函数中迭代这个生成器对象,并打印生成的每个数字。

await

await 关键字用于等待异步操作完成。它只能在 async 函数或 async 生成器函数中使用。

例如,以下示例演示如何使用 await 关键字来生成一组从 0 到 n-1 的整数,并延迟每