在{strong> Dart 中,yield
关键字实际上是什么?想得到一个解释。
答案 0 :(得分:6)
yield
向周围的async*
函数的输出流添加一个值。就像return
,但不会终止函数。
请参见https://dart.dev/guides/language/language-tour#generators
Stream asynchronousNaturalsTo(n) async* {
int k = 0;
while (k < n) yield k++;
}
执行yield语句时,它将对表达式的求值结果添加到流中。它不一定挂起(尽管在当前的实现中会挂起)。
答案 1 :(得分:1)
yield
语句只能在生成器的函数中使用。
生成器的功能以自然方式生成数据项(如计算得出的,从外部接收的,预定义的值等)。
当下一个数据项准备就绪时,yield
语句将该项目发送到数据序列中,这实际上是函数的生成结果。
数据序列可以是同步的也可以是异步的。
在Dart语言中,同步数据序列表示Iterable
的实例。
异步数据序列表示Stream
的实例。
P.S。
生成器函数可以无限期地生成数据项,直到函数返回为止。
但是与普通函数不同,结果(数据序列)将在函数调用后立即返回并可以立即使用。
在这种情况下,只有当生成器功能将终止(成功或失败)时,才能到达数据序列的末尾。
答案 2 :(得分:1)
接受的答案的链接已断开,here是关于async* sync* yield* yield
的官方链接。
如果您有使用其他语言的经验,则可能会使用这些关键字。这是一些克服关键字的提示。
async* sync* yield* yield
被称为生成器功能。您可能主要在 Bloc模式中使用它们。
async*
也是async
,您可以照常使用异步。
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);
}
}
如果有任何错误,请发表评论以纠正答案。
答案 3 :(得分:1)
我认为 yield* 的正确答案是委托给另一个生成器而不是调用函数。 yield* 只是委托给另一个生成器,这意味着当前生成器停止,另一个生成器接手工作,直到它停止生产。在那之后停止生成值,主生成器恢复生成自己的值。
感谢@András Szepesházi 鼓励我发布此评论作为答案,希望对您有所帮助。