在扩展函数时我要扩展什么?
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() 的方法调用相同。
但是,现在我们有两个问题:
相反,添加像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
}