我了解the extension
feature in Dart,但是如何将其与函数一起使用?
本质上,我面临两个问题:
我可以在上(extension FancyFunction on ?
)进行哪些扩展?
我想添加一个像toAsync
这样的函数,使该函数返回其通常结果的Future
。
我将如何实现呼叫?
我可以创建一个执行callAsync
或this()
的{{1}}成员,但是我想使用常规的调用语法,即只是括号。
答案 0 :(得分:1)
Dart有一个Function
type。这可以扩展,并且可以根据需要传递类型参数。
这是example from the changelog:
extension CurryFunction<R, S, T> on R Function(S, T) { ... }
此外,您可以扩展函数的任何typedef
。
要添加toAsync
和callAsync
功能,可以使用通用返回类型R
。请注意,这只会扩展不带参数的函数,因为Function()
不带参数:
extension FancyFunction<R> on R Function() {
Future<R> Function() toAsync() => () async => this();
}
现在,可以这样使用:
void syncHello() => print('Hello');
void main() {
final asyncHello = syncHello.toAsync();
asyncHello().then((_) => print(', World!'));
}
Dart中的每个课程都可以implement the call
method。您可以仅使用括号或使用.call()
来执行此方法。
这是一个示例实现:
extension FancyFunction<R> on R Function() {
Future<R> call() async => this();
}
由于每个Function
已经实现了call
,所以不能隐式调用扩展成员 。
相反,您将必须明确声明您的函数为FancyFunction
才能调用它:
void syncHello() => print('Hello');
void main() {
FancyFunction(syncHello)()
.then((_) => print(', World!'));
}
请注意,FancyFunction(syncHello)()
与FancyFunction(syncHello).call()
是相同的方法调用。
但是,现在我们有两个问题:
我们必须明确声明我们的函数为FancyFunction
,这在一定程度上违背了扩展的目的。
call
方法将始终返回Future
,因为当我们声明FancyFunction
时无法再访问常规调用方法。
相反,添加类似callAsync
的方法似乎是更好的解决方案:
extension FancyFunction<R> on R Function() {
Future<R> callAsync() async => this();
}
现在,callAsync
可以再次隐式使用:
void syncHello() => print('Hello');
void main() {
syncHello.callAsync()
.then((_) => print(', World!'));
syncHello(); // regular call
}