如何在Dart中扩展功能?

时间:2019-10-08 23:06:09

标签: dart

我了解the extension feature in Dart,但是如何将其与函数一起使用?

本质上,我面临两个问题:

  1. 我可以在extension FancyFunction on ?)进行哪些扩展?
    我想添加一个像toAsync这样的函数,使该函数返回其通常结果的Future

  2. 我将如何实现呼叫
    我可以创建一个执行callAsyncthis()的{​​{1}}成员,但是我想使用常规的调用语法,即只是括号。

1 个答案:

答案 0 :(得分:1)

扩展功能时我要扩展什么?

Dart有一个Function type。这可以扩展,并且可以根据需要传递类型参数。
这是example from the changelog

extension CurryFunction<R, S, T> on R Function(S, T) { ... }

此外,您可以扩展函数的任何typedef

要添加toAsynccallAsync功能,可以使用通用返回类型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
}