📜  Dart的生成器(1)

📅  最后修改于: 2023-12-03 15:00:20.621000             🧑  作者: Mango

Dart的生成器

在Dart中,生成器是一种特殊的函数,它返回一个“lazy iterator”(惰性迭代器)。在每次调用生成器时,它会生成一个序列的值,并且仅在需要这些值时才会计算这些值。这种技术被称为“惰性计算”。

基本语法

要创建一个生成器函数,需要在函数体前面加上*符号,这个函数只需使用yield语句生成值:

Iterable<int> countTo(int max) sync* {
  for (int i = 1; i <= max; i++) {
    yield i;
  }
}

这是一个最简单的生成器函数的例子。它会生成一个整数序列,从1到指定的数字,使用yield语句来生成一个新的值。

迭代生成器

当你拥有生成器时,你可以使用for...in循环来迭代它们:

void main() {
  for (var i in countTo(5)) {
    print(i);
  }
}

在这个例子中,countTo()函数返回一个整数序列,使用for...in来迭代这个序列中的每一个值。

双向迭代器

除了使用惰性计算,Dart生成器还有一个主要的不同之处:它们可以向前和向后迭代。

要使用双向迭代器,只需使用yield语句生成两个值。例如:

Iterable<int> fibonacci() sync* {
  int a = 0, b = 1;
  while (true) {
    yield a;
    yield b;
    int next = a + b;
    a = b;
    b = next;
  }
}

在这个例子中,fibonacci()函数会生成斐波那契数列中的值,它将生成一个值,然后生成下一个值,再生成下一个值,依此类推。

异步生成器

在Dart中,还可以创建异步生成器。异步生成器是一种特殊的生成器函数,它使用async*关键字而不是sync*关键字:

Stream<int> countDownFrom(int max) async* {
  while (max >= 0) {
    yield max--;
  }
}

在这个例子中,countDownFrom()函数使用异步方式生成一个整数序列,然后使用await for循环来等待序列中的值。

总结

在Dart中,生成器是一种特殊的函数,它返回一个惰性计算的序列。你可以使用for...in循环来迭代这个序列中的值,也可以使用异步生成器来使用这个技术异步地生成这个序列。

这里详细介绍了Dart生成器的基础知识,通过这种方法,您将能够更好地理解这种技术,并在您的代码中使用它。