📅  最后修改于: 2023-12-03 15:00:20.621000             🧑  作者: Mango
在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生成器的基础知识,通过这种方法,您将能够更好地理解这种技术,并在您的代码中使用它。