Dart 中生成器:全面解析
2024-02-09 02:15:31
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
函数中迭代这个生成器对象,并打印生成的每个数字。
异步生成器
异步生成器是生成器函数的另一种类型,它以异步方式生成值。这意味着它可以在生成下一个值之前挂起,而不会阻塞当前线程。异步生成器函数使用关键字 async
和 yield
来生成值。
以下是异步生成器函数的示例:
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
函数是一个异步生成器函数,它使用 async
和 yield
关键字来生成一组从 0 到 n-1 的整数。然后,我们在 main
函数中异步迭代这个生成器对象,并打印生成的每个数字。
需要注意的是,异步生成器函数只能用于生成 Stream
对象。
Stream 和 Iterable
Stream
和 Iterable
是 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
函数是一个同步生成器函数,它使用 yield
和 yield*
关键字来生成斐波那契数列。我们可以在 main
函数中迭代这个生成器对象,并打印生成的每个数字。
await
await
关键字用于等待异步操作完成。它只能在 async
函数或 async
生成器函数中使用。
例如,以下示例演示如何使用 await
关键字来生成一组从 0 到 n-1 的整数,并延迟每