Dart中收益与收益*之间的差异

时间:2019-08-14 10:02:57

标签: flutter dart

我想知道这两者之间有什么区别。我在javascript Delegated yield (yield star, yield *) in generator functions

上找到了这个帖子

据我了解,yield*委托给另一个生成器,并且在另一个生成器停止生成值之后,它会继续生成自己的值。

飞镖一侧的说明和示例会有所帮助。

2 个答案:

答案 0 :(得分:9)

简短回答

  • yield从Iterable或Stream中返回值。
  • yield*用于递归调用其Iterable或Stream函数。

示例

让我们看一下Generator Functions - Flutter in Focus视频中的一些示例。我们只看一下Iterable示例,但对于Streams来说是相似的。

表格1

这是一个从startfinish的Iterable。

Iterable<int> getRange(int start, int finish) sync* {
  for (int i = start; i <= finish; i++) {
    yield i;
  }
}

yield关键字在每次迭代时返回下一个值。

表格2

现在让我们将该函数重构为递归的。在外部,它仍然执行与以前相同的操作:

Iterable<int> getRange(int start, int finish) sync* {
  if (start <= finish) {
    yield start;
    for (final val in getRange(start + 1, finish)) {
      yield val;
    }
  }
}

这有效,但是由于循环的原因,它很难阅读且效率不高。

表格3

现在让我们使用yield*(发音为“良率之星”)再次对其进行重构:

Iterable<int> getRange(int start, int finish) sync* {
  if (start <= finish) {
    yield start;
    yield* getRange(start + 1, finish);
  }
}

它仍然是递归的,但是现在它更易于阅读并且更有效。

答案 1 :(得分:4)

如您所说,yield*实际上是委派给另一个生成器,并且在另一个生成器停止生成值之后,它会继续生成自己的值。

示例yield*

import 'dart:async';

main() async {
  await for (int i in numbersDownFrom(5)) {
    print('$i bottles of beer');
  }
}

Stream numbersDownFrom(int n) async* {
  if (n >= 0) {
    await new Future.delayed(new Duration(milliseconds: 100));
    yield n;
    yield* numbersDownFrom(n - 1);
  }
}

输出:

5 bottles of beer
4 bottles of beer
3 bottles of beer
2 bottles of beer
1 bottles of beer
0 bottles of beer

Source


yield用于作为StreamController中使用的流发出值,此示例显示,您还可以尝试使用Future.delayed以便在特定持续时间后接收值< / p>

示例(yield

Stream<int> str() async* {
  // The keyword `async*` means a "generator function" that generates a stream
  List<int> a = [1, 2, 3, 4, 5];
  for (var e in a) {
    if (e > 2) yield e;
  }
}

main() async {
  await for (var e in str()) {
    print(e);
  }
}

输出:

3
4
5

Source