Dart中sync*生成的Iterable为何在消费时才执行?求答疑
这是Dart
sync*生成器的正常行为,并非Bug 你观察到的现象完全符合Dart中同步生成器函数(sync*)的设计逻辑:
sync*函数返回的是一个惰性求值的Iterable。当你调用makeStream()时,只是创建了一个Iterable对象,函数体内部的代码并不会立即执行。- 只有当你开始迭代这个Iterable(比如使用
for-in循环)时,函数体的代码才会被触发执行,直到遇到第一个yield返回值;后续每次迭代都会继续执行函数体到下一个yield,直到函数结束。
你的代码里,final stream = makeStream()这一步只是拿到了Iterable的引用,并没有触发迭代,所以print('making a stream')会被推迟到for(var v in stream)开始循环时才执行,这完全是预期内的行为。
如果想要在调用函数时就执行yield之前的代码,你需要放弃生成器的惰性特性,比如直接返回一个提前构建好的集合:
Iterable<int> makeStream() { print('making a stream'); return List.generate(10, (_) => 25); }
这样调用makeStream()时就会立刻执行打印语句,并返回一个已填充好的List。
内容的提问来源于stack exchange,提问作者Marnix
相关产品推荐
相关产品推荐

