gpt4 book ai didi

dart - 这些函数返回值在 Dart 中如何工作?

转载 作者:行者123 更新时间:2023-12-03 03:12:03 32 4
gpt4 key购买 nike

official Bloc documentation给出以下代码片段:

Stream<int> countStream(int max) async* {
for (int i = 0; i < max; i++) {
yield i;
}
}

这个看起来对我来说非常简单,直到我意识到该函数不返回任何东西(没有 return 语句),但一直产生(对我来说 - 来自 python - 与 return 语句相同)。

还有这个例子,更加清晰:

Future<int> sumStream(Stream<int> stream) async {
int sum = 0;
await for (int value in stream) {
sum += value;
}
return sum;
}

这里有一个int显式返回,但是如果我正确地阅读了这个函数定义应该返回 Future<int>类型:

Future<int> sumStream(Stream<int> stream) async { //...

现在,这是如何工作的?我在这里有点困惑。

提前致谢!阿克塞尔。

最佳答案

对于第一个示例,countStream 是一个使用 async* 设计的整数Stream。 (照顾星星)
在此流定义中,在流上发出一个新整数(由 stream < int > 表示的整数。
如果消费该流,您将得到 0,1,2,3,4,...,max-1

在第二个片段中,将其读作:sumStream 一个必须返回 int 的 Future。
更一般地说,Future 实例会生成 T 类型的值。
sumStream 将消耗一个流(在参数中给出),只要该流有值,就对它们求和并在完成时返回最后的总和。 Sum 是一个整数:Future 定义没问题。

同时使用两者,您可以:

> void main() async  {   
print(await sumStream(countStream(5)));
}

结果:1​​0 (0+1+2+3+4)

由于 sumStream 是一个 Future,main 可以等待异步执行:它声明了使用 async 函数的意图(异步声明),然后它可以使用 wait 来停止自己的执行,直到 sumStream 返回。

如果你离开 main 而不使用异步,另一种方法是向 Future 添加一个 .then 子句:

void main()  {
sumStream(countStream(5)).then((x)=>print(x));
print("after sumStream");
}

结果:
sumStream 之后
10

正如您所看到的,sumStream 的主要传递已经开始,但尚未完成,并且首先打印(“after sumStream”)。
然后 main 完成,但是 Dart 知道仍然有异步作业在运行,它会等到所有完成,所以我们可以看到结果,但是一旦 Future sumStream 完成。

HTH

关于dart - 这些函数返回值在 Dart 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59604906/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com