将类型函数作为Dart中的参数传递

问题描述 投票:13回答:5

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

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

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

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

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

有没有其他方法来指定作为参数传递的函数的签名?

functional-programming dart
5个回答
18
投票

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

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

它具有优于函数参数语法的优点,您还可以将其用于变量或您想要编写类型的任何其他位置。

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

var x = new List<int Function(int)>[];

11
投票

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

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

typedef void IntegerArgument(int x);

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

Function<int>似乎是一个不错的主意,但问题是我们可能想要指定返回类型以及任意数量的参数的类型。


2
投票

您可以使用函数类型参数或使用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


1
投票

这就是typedefs的用途!


1
投票

以供参考。

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

print(execute((a, b) => a + b));
© www.soinside.com 2019 - 2024. All rights reserved.