我正在学习生成器函数,在文档中,生成器函数是延迟求值的,但这有什么好处,为什么你会关心呢?你会看到这个同步生成器函数:
Iterable<int> naturalsTo(int n) sync* {
int k = 0;
while (k < n) yield k++;
}
但是如果我这么做会有什么不同呢?
Iterable<int> naturalsTo(int n) {
List<int> numbers = [];
for (int i = 0; i <= n; i++) {
numbers.add(i);
}
return numbers;
}
两个代码做完全相同的事情?如果我去生成器函数,有内存优势吗?
2条答案
按热度按时间0sgqnhkj1#
如果我这样做会有什么不同?
第一个是流
sync*
,这意味着无论何时调用yield
,它都是订阅者接收值。第二个是普通的方法,它的调用者必须等到内部循环(在你的例子中)完成。
b1payxdu2#
生成器函数可以任意添加值,而标准函数可以一次性添加值:到返回对象中。
对于大型或无限的值序列,生成器函数比标准函数更节省内存,因为值不是一次添加的。
yield
关键字是按需添加值的关键字。