You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:32:02