Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 在Dart中将类型化函数作为参数传递_Functional Programming_Dart - Fatal编程技术网

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

Functional programming 在Dart中将类型化函数作为参数传递,functional-programming,dart,Functional Programming,Dart,我知道该类可以作为参数传递给另一个函数,如下所示: void doSomething(Function f) { f(123); } 但是有没有办法约束参数和函数参数的返回类型 例如,在本例中,f直接在整数上调用,但如果它是接受不同类型的函数呢 我尝试将其作为函数传递,但函数不是参数化类型 是否有其他方法可以指定作为参数传递的函数的签名?这就是它的用途 编辑:请注意,此答案包含过时的信息。有关更多最新信息,请参阅 为了扩展Randal的答案,您的代码可能如下所示: typedef vo

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

void doSomething(Function f) {
    f(123);
}
但是有没有办法约束参数和函数参数的返回类型

例如,在本例中,
f
直接在整数上调用,但如果它是接受不同类型的函数呢

我尝试将其作为
函数
传递,但函数不是参数化类型


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

这就是它的用途

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

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

typedef void IntegerArgument(int x);

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

Function
似乎是个不错的主意,但问题是我们可能希望指定返回类型以及任意数量参数的类型。

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

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

void doSomething(函数(int)f){
f(123);
}
与函数参数语法相比,它的优点是,您还可以将它用于变量或任何您想要编写类型的地方

void doSomething(函数(int)f){
函数(int)g=f;
g(123);
}
var x=[];
int函数(int)returnsFunction()=>(int x)=>x+1;
供参考

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

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

太好了,谢谢!无论如何,这只回答了问题的前半部分。返回类型如何?添加了返回类型的示例,该返回类型是函数类型。StreamSubscription listen(void onData(T事件),{function onError,void OnOne(),bool cancelOnError});-为什么使用两种不同的符号?使用一个或另一个(OnOne vs onError)的原因是什么?也许有人可以将其添加到答案中?
onError
参数设置为接受一个
函数(所有函数的超级类型),而不是一个特定的函数类型。这是因为它同时接受
void函数(Object)
void函数(Object,StackTrace)
,在Dart类型系统中无法表示该类型联合。其余的参数可以使用所需的特定函数类型键入。由于答案中隐藏了一点,因此这是如何在另一个函数中传递返回类型为参数的类型化函数:
int outerFn(bool function(String,bool)innerFn){final result=innerFn(“123”,true);}