实际上yield
关键字在Dart中起什么作用?想得到解释。
yield
为周围的async*
函数的输出流添加一个值。它就像return
,但不会终止该功能。
见https://dart.dev/guides/language/language-tour#generators
Stream asynchronousNaturalsTo(n) async* {
int k = 0;
while (k < n) yield k++;
}
yield语句执行时,会将其表达式的计算结果添加到流中。它不一定是暂停的(尽管在当前的实现中它确实如此)。
接受的答案的链接被打破,here是关于async* sync* yield* yield
的官方链接。
如果您对其他语言有一些经验,可能会坚持使用这些关键字。以下是获取关键字的一些提示。
async* sync* yield* yield
被称为发电机功能。您可能主要使用Bloc模式。async*
也是一个async
,你可以照常使用Asynchronous。sync*
不能用作sync
,你会收到错误,注意到“修改器同步必须跟一个星星”。yield
和yield*
只能用于生成器函数(async*
sync*
)。并且有四种组合。
async* yield
将返回Stream<dynamic>
。Stream<int> runToMax(int n) async* {
int i = 0;
while (i < n) {
yield i;
i++;
await Future.delayed(Duration(seconds: 300));
}
}
async* yield*
将调用函数并返回Stream<dynamic>
。Stream<int> countDownFrom(int n) async* {
if (n > 0) {
yield n;
yield* countDownFrom(n - 1);
}
}
sync* yield
将返回Iterable<dynamic>
。Iterable<int> genIterates(int max) sync* {
var i = 0;
while (i < max) {
yield i;
i++;
}
}
sync* yield*
将调用函数并返回Iterable<dynamic>
。Iterable<int> countDownFrom(int n) sync* {
if (n > 0) {
yield n;
yield* countDownFrom(n - 1);
}
}
如果有任何错误,请发表评论以更正答案。
yield
语句只能用于生成器的函数。
生成器的功能以自然的方式生成数据项(如计算,从外部接收,预定义值等)。
当下一个数据项准备就绪时,yield
语句将此项发送到数据序列,该数据序列本质上是函数的生成结果。
数据序列可以是同步的或异步的。
在Dart语言中,同步数据序列表示Iterable
的实例。
异步数据序列表示Stream
的实例。
附: 生成器函数可以无限期地生成数据项,直到函数返回。 但与普通函数不同,结果(数据序列)将在函数调用后立即返回,并可立即使用。 在这种情况下,只有在终止发电机功能(成功或失败)时才能到达数据序列的末尾。