gpt4 book ai didi

dart - 如何在Dart中扩展功能?

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

我知道the extension feature in Dart,但是如何与函数一起使用呢?

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

  • 我如何在(extension FancyFunction on ?)上扩展
    我想添加一个类似于toAsync的函数,该函数使该函数返回其通常结果的Future
  • 我将如何实现调用
    我可以创建一个执行callAsyncthis()this.call()成员,但是我想使用常规调用语法,即仅使用括号。
  • 最佳答案

    扩展功能时要扩展什么?

    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
    }

    关于dart - 如何在Dart中扩展功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58295050/

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