Dart中的收益示例

时间:2018-10-13 13:24:23

标签: functional-programming dart

如何在Dart中与Scala一样使用yield? Scala中有一个示例“ https://alvinalexander.com/scala/scala-for-loop-yield-examples-yield-tutorial

scala> val a = Array(1, 2, 3, 4, 5)
a: Array[Int] = Array(1, 2, 3, 4, 5)

scala> for (e <- a if e > 2) yield e
res1: Array[Int] = Array(3, 4, 5)

我该怎么用飞镖做?

void main() {
  var a = [1, 2, 3, 4, 5];

  for (var e in a) {
    if (e > 2) yield e;
  }
}

2 个答案:

答案 0 :(得分:7)

Dart和JavaScript具有异步/等待机制。

异步产生值的函数是一个返回Stream的异步函数

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);
  }
}

答案 1 :(得分:3)

for (e <- a if e > 2) yield e表达式是Scala中的expression。 它求值为一个数组。 Dart没有将其作为直接表达式,但是您可以使函数以几乎相同的方式返回可迭代对象,然后立即调用它们以创建表达式:

var a = [1, 2, 3, 4, 5]
var res = () sync* { for (var v in a) if (v > 2) yield v; } ();

在这里,我介绍一个函数() sync* { for (var v in a) if (v > 2) yield v; }并立即调用它。该函数返回一个Iterable。可迭代的元素是主体yield'ed的值,在这种情况下为3、4和5。