【问题标题】:Pass a typed function as a parameter in Dart在 Dart 中将类型化函数作为参数传递
【发布时间】:2017-09-06 04:17:29
【问题描述】:

我知道Function 类可以作为参数传递给另一个函数,如下所示:

void doSomething(Function f) {
    f(123);
}

但是有没有办法约束参数和函数参数的返回类型?

例如,在这种情况下,f 是直接在一个整数上调用的,但如果它是一个接受不同类型的函数呢?

我尝试将其作为 Function<Integer> 传递,但 Function 不是参数类型。

还有其他方法可以指定作为参数传递的函数的签名吗?

【问题讨论】:

    标签: functional-programming dart


    【解决方案1】:

    要在 dart 中强类型化函数,请执行以下操作:

    1. 写下Function 关键字
    Function
    
    1. 为其返回类型添加前缀(例如void
    void Function
    
    1. 用括号附加
    void Function()
    
    1. 将逗号分隔的参数放在括号内
    void Function(int, int)
    
    1. 可选 - 为您的论点命名
    void Function(int foo, int bar)
    

    现实生活中的例子:

    void doSomething(void Function(int arg) f) {
        f(123);
    }
    

    【讨论】:

      【解决方案2】:

      Dart v1.23 添加了一种用于编写函数类型的新语法,它也可以内联工作。

      void doSomething(Function(int) f) {
        f(123);
      }
      

      与函数参数语法相比,它的优势在于您还可以将其用于变量或您想编写类型的任何其他地方。

      void doSomething(Function(int) f) {
        Function(int) g = f;
        g(123);
      }
      
      var x = <int Function(int)>[];
      
      int Function(int) returnsAFunction() => (int x) => x + 1;
          
      int Function(int) Function() functionValue = returnsAFunction;
      

      【讨论】:

      • 这太好了,谢谢!无论如何,这仅回答了问题的前半部分。返回类型如何?
      • 添加了函数类型的返回类型示例。
      • StreamSubscription listen(void onData(T event), {Function onError, void onDone(), bool cancelOnError}); - 为什么使用 2 种不同的符号?使用其中一个或另一个的原因是什么(onDone vs onError)?也许有人可以将其添加到答案中?
      • onError 参数设置为接受Function(所有函数的超类型)而不是特定的函数类型。那是因为它同时接受void Function(Object)void Function(Object, StackTrace),并且在Dart 类型系统中无法表示该类型联合。剩下的参数可以用需要的具体函数类型来输入。
      • 因为它有点隐藏在答案中,这是如何在另一个函数中传递一个返回类型作为参数的类型化函数:int outerFn(bool Function(String, bool) innerFn) { final result = innerFn("123", true); }
      【解决方案3】:

      供参考。

      int execute(int func(int a, int b)) => func(4, 3);
      
      print(execute((a, b) => a + b));
      

      【讨论】:

        【解决方案4】:

        编辑:请注意,此答案包含过时的信息。有关更多最新信息,请参阅Irn's answer

        只是为了扩展 Randal 的答案,您的代码可能类似于:

        typedef void IntegerArgument(int x);
        
        void doSomething(IntegerArgument f) {
            f(123);
        }
        

        Function&lt;int&gt; 似乎是个好主意,但问题是我们可能想要指定返回类型以及任意数量参数的类型。

        【讨论】:

          【解决方案5】:

          您可以使用函数类型参数或使用typedef

          void main() {
            doSomething(xToString);
            doSomething2(xToString);
          }
          
          String xToString(int s) => 's';
          
          typedef String XToStringFn(int s);
          
          void doSomething(String f(int s)) {
              print('value: ${f(123)}');
          }
          
          void doSomething2(XToStringFn f) {
              print('value: ${f(123)}');
          }
          

          DartPad example

          【讨论】:

            【解决方案6】:

            这就是typedefs 的用途!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-21
              • 2018-01-04
              • 1970-01-01
              • 2022-10-06
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多