我来自Python,我记得Python生成器通过关键字
yield
返回值:
def generate_num() {
n = 0
while True:
yield n
print(generate_num()) # Outputs 0
print(generate_num()) # Outputs 1
print(generate_num()) # Outputs 2
...
在学习 Dart 时,我发现 Dart 的做法有点不同。所以在下面的代码中:
void main() {
generate_num().takeWhile((val) {
if (val == 2) {
return false;
}
return true;
}).forEach(print);
}
Iterable<int> generate_num() sync* {
int n = 0;
while(true) {
yield n;
}
}
当我运行程序时,它卡在 while 循环中!对该函数的调用会产生所有可能的值,但它无法产生,因为 while 循环设置为
true
。这在 Python 中似乎非常不同,其中单个调用将产生单个值,而不是所有值。 Dart 有没有办法创建像 Python 一样的生成器?
forEach
正在经历 Iterable
的 每个元素,好吧,在你的情况下这将是无限的。
void main() {
final iterator = generateNum().iterator;
print((iterator..moveNext()).current);
print((iterator..moveNext()).current);
print((iterator..moveNext()).current);
}
Iterable<int> generateNum() sync* {
int n = 0;
while(true) {
yield n++;
}
}
请注意,
takeWhile
会延迟计算,因此以下操作将会成功并且您可以将其应用到您的Iterable
并使用迭代器(final iterator = generateNum().takeWhile(...).iterator
):
void main() {
print(generateNum().takeWhile((val) {
if (val == 2) {
return false;
}
return true;
}).first);
}