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

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

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

But is there a way to constrain the arguments and the return type of the function parameter?

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

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

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

86406 次浏览

这就是 Typedef的作用!

编辑: 注意这个答案包含过时的信息。请参阅 Irn 的回答了解更多的最新信息。

扩展一下 Randal 的回答,你的代码可能看起来像这样:

typedef void IntegerArgument(int x);


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

Function<int> seems like it would be a nice idea but the problem is that we might want to specify return type as well as the type of an arbitrary number of arguments.

可以使用函数类型化参数或使用 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 的例子

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;

作为参考。

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


print(execute((a, b) => a + b));

要在省道中强键入函数,请执行以下操作:

  1. 写下 Function关键字
Function
  1. 以它的返回类型作为前缀(例如 void)
void Function
  1. 在后面加上括号
void Function()
  1. 在括号内放置逗号分隔的参数
void Function(int, int)
  1. 选择性地——给你的论点命名
void Function(int foo, int bar)

Real life example:

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