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