2017-04-11 1 views
2

에 매개 변수로 입력 기능을 전달합니다나는이처럼 <a href="https://api.dartlang.org/stable/1.22.1/dart-core/Function-class.html" rel="nofollow noreferrer" title="Function">Function</a> 클래스가 다른 함수에 매개 변수로 전달 될 수있어 다트

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

는 그러나 인수 및 반환 형식을 제한 할 수있는 방법이 함수 매개 변수의?

예를 들어이 경우 f은 정수에서 직접 호출되지만 다른 유형을 받아들이는 함수 인 경우 어떻게됩니까?

나는 이것을 Function<Integer>으로 전달하려고했지만 Function은 매개 변수 유형이 아닙니다.

매개 변수로 전달되는 함수의 서명을 지정하는 다른 방법이 있습니까?

답변

4

그냥 랜달의 대답에 확장, 코드가 같이 보일 수 있습니다 그것은 좋은 생각이 될 것 같은

typedef void IntegerArgument(int x); 

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

Function<int> 보인다 그러나 문제는 우리가뿐만 아니라 반환 유형을 지정 할 수 있습니다 것입니다 임의의 수의 인수 유형.

1

이것은 무엇입니까 typedefs입니다!

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) { 
    Function(int) g = f; 
    g(123); 
} 

var x = new List<int Function(int)>[];