考虑这个例子:
library(dplyr)
data %>% group_by(Team) %>%
mutate(teamtype = ifelse(all(Gender=="M"), "OnlyM", "Mixed"))
Source: local data frame [6 x 5]
Groups: Team [3]
Name Age Gender Team teamtype
(fctr) (int) (fctr) (fctr) (chr)
1 John 18 M A OnlyM
2 Luke 75 M B Mixed
3 Dean 20 M C OnlyM
4 Zoe 34 F B Mixed
5 Chloe 12 F B Mixed
6 Erik 56 M A OnlyM
Future<int> doAsyncThing() => new Future.value(42);
usingAsync() async => doAsyncThing();
main() {
var thing = usingAsync();
// what is the runtimeType of thing ?
}
返回的对象的runtimeType是什么?会是usingAsync()
还是Future<Future<int>>
还是其他什么?
答案 0 :(得分:5)
usingAsync()
的返回类型在技术上是dynamic
,因为没有为usingAsync()
指定的返回类型注释。省略返回类型注释与使用dynamic
作为返回类型注释相同。
usingAsync()
返回的对象的runtimeType为Future<dynamic>
。标有async
的函数只会返回Future<dynamic>
个对象。
当来自usingAsync()
的未来完成时,它会变平&#34;它包含Future,并以int
完成。
import 'dart:async';
Future<int> doAsyncThing() => new Future.value(42);
usingAsync() async => doAsyncThing();
main() {
var thing = usingAsync();
// what is the runtimeType of thing ?
print(thing.runtimeType); // Future
thing.then((value) {
print(value); // 42
print(value.runtimeType); // int
});
}
原始问题中代码示例的作者可能想写:
Future<int> usingAsync() async => await doAsyncThing();
或者,甚至更清洁:
Future<int> usingAsync() => doAsyncThing();
也就是说,如果函数返回Future,则可能不需要将函数标记为异步。回到未来。