第2节:yield

yield语句只能用于生成器的函数。 生成器的功能以自然的方式生成数据项(如计算,从外部接收,预定义值等)。 当下一个数据项准备就绪时,yield语句将此项发送到数据序列,该数据序列本质上是函数的生成结果。 数据序列可以是同步的或异步的。 在Dart语言中,同步数据序列表示Iterable的实例。 异步数据序列表示Stream`的实例。

1.同步数据生成器: 返回一个 Iterable 对象.

Iterable<int> genIterates (int max) sync* {
  var i = 0;
  while (i < max) {
    yield i;
    i++;
  }
}
Future<void> main() async {
  var l = genIterates(10);
  print(l);//输出: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
}

2.异步数据生成器,返回一个Steam对象

Stream<int> runToMax (int n) async* {
  int i = 0;
  while (i < n) {
    yield i;
    i++;
    await Future.delayed (Duration (seconds: 1));
  }
}
Future<void> main() async {
  Stream<int> stream = runToMax(5);
  await for (var n in stream) {
    print(n); //每隔一秒打印一个,共打印出 0 1 2 3 4
  }
}

3.。yield后面的表达式必须表示另一个子序列。yield所做的是将子序列的所有元素插入到当前正在构造的序列中,就好像我们为每个元素都有一个单独的yield

Iterable<int> genIterates (int max) sync* {
  var i = 0;
  while (i < max) {
    yield i;
    i++;
  }
}
Iterable<int> countDownFrom (int n) sync* {
  if (n > 0) {
    yield n;
    yield* genIterates (n - 1);
  }
}
Future<void> main() async {
var l = countDownFrom(5);
    print(l);//打印:(5, 0, 1, 2, 3)
}

参考链接:https://dart.dev/language/functions#generators

results matching ""

    No results matching ""