如何让 Dart 生成器函数像 Python 一样工作?

问题描述 投票:0回答:1

我来自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 一样的生成器?

python dart generator
1个回答
3
投票

这里发生这种情况的原因是

forEach
正在经历 Iterable
每个 
元素,好吧,在你的情况下这将是无限的。
Python 示例的 Dart 版本可能看起来像这样(一次移动迭代器一个元素)。

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.