2017-04-11 169 views
2

我知道Function类可以作为参数传递给另一个函数被传递,就像这样:传递一个类型的函数作为参数在DART

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

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

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

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

是否有任何其他方式指定被传递的函数的签名作为参数?

回答

4

只是为了在兰德尔的答案扩大,你的代码可能看起来像:

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

4

飞镖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)>[];