flutter 了解生成器函数的用途

cclgggtu  于 2023-03-19  发布在  Flutter
关注(0)|答案(2)|浏览(121)

我正在学习生成器函数,在文档中,生成器函数是延迟求值的,但这有什么好处,为什么你会关心呢?你会看到这个同步生成器函数:

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;
}

两个代码做完全相同的事情?如果我去生成器函数,有内存优势吗?

0sgqnhkj

0sgqnhkj1#

如果我这样做会有什么不同?
第一个是流sync*,这意味着无论何时调用yield,它都是订阅者接收值。
第二个是普通的方法,它的调用者必须等到内部循环(在你的例子中)完成。

b1payxdu

b1payxdu2#

生成器函数可以任意添加值,而标准函数可以一次性添加值:到返回对象中。
对于大型或无限的值序列,生成器函数比标准函数更节省内存,因为值不是一次添加的。
yield关键字是按需添加值的关键字。

Iterable<int> listTo(int n) { //Standard function
  List<int> numbers = [];
  for (int i = 0; i <= n; i++) {
    numbers.add(i);
  }
  return numbers; //Adds values to the return object at once.
}
Iterable<int> countTo() sync* { //Generator function
  yield 0; //0 added to the return object and so on.
  yield 1; 
  yield 2;
  yield 3;
}

void main() {
  print(countTo());
  print(listTo(3));
}

相关问题