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



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

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

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

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

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

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

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;

要在 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);
}

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

只是为了扩展 Randal 的答案,您的代码可能如下所示:

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

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

供参考。

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

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

飞镖垫示例

这就是typedefs的用途!

最新更新