2010-01-18 2 views
18

난 당신이 익명 함수를 만들 수 있습니다 알고, 그것의 반환 형식 추론 컴파일러가 :스칼라에서 익명 함수의 반환 형식을 지정할 수 있습니까?

val x =() => { System.currentTimeMillis } 

그냥 정적 타이핑을 위하여, 그것의 반환뿐만 아니라 유형을 지정할 수 있습니까? 나는 그것이 물건을 훨씬 더 분명하게 할 것이라고 생각합니다. 제 생각에는

답변

27

당신이 함수의 결과가 아니라이 유형 약어를 추가하여 식별자 X에 대한 기대를 문서화하는 것이 좋습니다 일을 더 명확하게하려고하는 경우.

val x:() => Long =() => System.currentTimeMillis

그러면 컴파일러는 오른쪽에있는 기능이 해당 기대치를 충족시키는 지 확인합니다.

+0

왼편의 함수가 기대치 *를 충족 시킨다는 것이 무슨 뜻인지 확실치 않으므로 결과 블록의 유형을 설정하면 유형이 정확함을 보장 할 수 있습니다. 'val x =() => {System.currentTimeMillis} : String'은 컴파일되지 않습니다. 아니면 뭔가 다른 것을 의미합니까? –

+0

제프의 대답은 전체 유형을 앞당기는 이점이 있습니다. 긴 (여러 줄) 함수 정의가있는 경우 유형이 처음에있는 경우 진행되는 작업을 가장 빨리 이해할 수 있습니다. 파비안의 답은 반복이 적다는 장점이 있습니다 (짧은 (한 줄짜리) 정의에 좋고 모든 것을 한 눈에 볼 수 있다면 더 빨리 이해할 수 있습니다). –

+0

오, 이제 Geoff의 요지가 보입니다. 그의 입력 정의에는 입력 유형이 포함되어 있습니다.이 입력 유형은'()'이며,'() => System.currentTimeMillis'가'x'에 할당 될 때 검사됩니다. –

37
val x =() => { System.currentTimeMillis } : Long 
+0

이 문제가 해결되었습니다. Function # 접근법을 사용하는 것보다 덜 장황하게 만들었습니다. –

+0

은 'val x =() => Long = {blah}'와 같이 더 직관적 인 구문입니다. 답변 해주셔서 감사합니다! – wbarksdale

9

파비안은 간단한 방법을 준,하지만 설탕 대한 세부적인이 마음에 몇 가지 다른 방법은 다음과 같습니다 :

val x = new (() => Long) { 
    def apply() = System.currentTimeMillis 
} 

또는

val x = new Function0[Long] { 
    def apply() = System.currentTimeMillis 
} 

또는 이후도

val x = new { 
    def apply(): Long = System.currentTimeMillis 
} 

대부분의 상황을 함수에서 파생되면 아무런 차이가 없습니다.

관련 문제