我想知道这两者之间有什么区别。我在javascript Delegated yield (yield star, yield *) in generator functions
上找到了这个帖子据我了解,yield*
委托给另一个生成器,并且在另一个生成器停止生成值之后,它会继续生成自己的值。
飞镖一侧的说明和示例会有所帮助。
答案 0 :(得分:9)
yield
从Iterable或Stream中返回值。yield*
用于递归调用其Iterable或Stream函数。让我们看一下Generator Functions - Flutter in Focus视频中的一些示例。我们只看一下Iterable示例,但对于Streams来说是相似的。
这是一个从start
到finish
的Iterable。
Iterable<int> getRange(int start, int finish) sync* {
for (int i = start; i <= finish; i++) {
yield i;
}
}
yield
关键字在每次迭代时返回下一个值。
现在让我们将该函数重构为递归的。在外部,它仍然执行与以前相同的操作:
Iterable<int> getRange(int start, int finish) sync* {
if (start <= finish) {
yield start;
for (final val in getRange(start + 1, finish)) {
yield val;
}
}
}
这有效,但是由于循环的原因,它很难阅读且效率不高。
现在让我们使用yield*
(发音为“良率之星”)再次对其进行重构:
Iterable<int> getRange(int start, int finish) sync* {
if (start <= finish) {
yield start;
yield* getRange(start + 1, finish);
}
}
它仍然是递归的,但是现在它更易于阅读并且更有效。
答案 1 :(得分:4)
如您所说,yield*
实际上是委派给另一个生成器,并且在另一个生成器停止生成值之后,它会继续生成自己的值。
示例yield*
import 'dart:async';
main() async {
await for (int i in numbersDownFrom(5)) {
print('$i bottles of beer');
}
}
Stream numbersDownFrom(int n) async* {
if (n >= 0) {
await new Future.delayed(new Duration(milliseconds: 100));
yield n;
yield* numbersDownFrom(n - 1);
}
}
输出:
5 bottles of beer
4 bottles of beer
3 bottles of beer
2 bottles of beer
1 bottles of beer
0 bottles of beer
yield
用于作为StreamController
中使用的流发出值,此示例显示,您还可以尝试使用Future.delayed
以便在特定持续时间后接收值< / p>
示例(yield
)
Stream<int> str() async* {
// The keyword `async*` means a "generator function" that generates a stream
List<int> a = [1, 2, 3, 4, 5];
for (var e in a) {
if (e > 2) yield e;
}
}
main() async {
await for (var e in str()) {
print(e);
}
}
输出:
3
4
5