我想知道这两者之间有什么区别。我在javascript上找到了这篇文章,Delegated yield (yield star, yield *) in generator functions
据我所知,yield*
委托给另一个生成器,在另一个生成器停止生成值后,它会继续生成自己的值。
dart 方面的解释和例子会很有帮助。
我想知道这两者之间有什么区别。我在javascript上找到了这篇文章,Delegated yield (yield star, yield *) in generator functions
据我所知,yield*
委托给另一个生成器,在另一个生成器停止生成值后,它会继续生成自己的值。
dart 方面的解释和例子会很有帮助。
4条答案
按热度按时间oyjwcjzk1#
我创建了一个dart pad链接来帮助人们进行实验:
Yield* 用于一次生成一个完整的可迭代值,而不使用循环。
这两个函数做的事情完全一样,根据开始值和结束值生成一个可迭代对象。
在第一个实现中(yield i)将隐含类型Iterable,它与函数的返回类型匹配。
现在如果在第二实现中代替
如果我们做了
我们将得到一个编译器错误:
正如你所看到的,yield用另一个Iterable〈〉 Package 了Iterable,这使得类型Iterable.不匹配函数的返回类型。
如果我们必须在不使用yield* 的情况下进行递归,我们将不得不这样做:
这是混乱和低效的。
所以我觉得在我看来,yield* 使另一个生成函数变平。
一些有用的资源:Generator Functions - Flutter in Focus video
中品:What are sync*, async*, yield and yield* in Dart?
f87krz0w2#
使用下面的代码来理解为什么不使用yield* 进行递归编码效率很低。
kadbb4593#
x1月0n1x日
它用于从异步或同步生成器发出值。
范例:
输出:
yield*
它会将呼叫委派给另一个产生器,在该产生器停止产生值之后,它会继续产生自己的值。
范例:
输出:
oipij1gg4#
简短回答
yield
从Iterable或Stream返回值。yield*
用于递归调用其Iterable或Stream函数。示例
让我们看看Generator Functions - Flutter in Focus视频中的一些例子。我们只看可迭代的例子,但流也是类似的。
表格1
这是一个从
start
到finish
的迭代项。关键字
yield
返回每次迭代的下一个值。表格2
现在,让我们重构这个函数,使其成为递归的。在外部,它仍然做着与前面相同的事情:
这是可行的,但它很难阅读,并不是很有效,因为循环。
表格3
现在,让我们使用
yield*
(读作“yield星星”)再次对其进行重构:它仍然是递归的,但现在更容易阅读,也更有效。