2017-09-14 2 views
0

개체를 반환하는 메서드를 래핑 할 수있는 제네릭 래퍼 함수를 ​​만들려고합니다. this에 대한 답변과 매우 유사합니다. 다음을 시도 :스칼라 : 제네릭 형식을 반환하는 래퍼 함수

def wrapper_function[T](f: => T): T = { 
    println("Executing now"); 
    val ret: T = f; 
    println("Execution finished"); 
    ret 
} 

def multiply2(x: Int): Int = wrapper_function { 
    println("inside multiply2"); 
    return x*2 
} 

그러나 나는 아무것도 래퍼 함수 내부에서 함수 호출 후 실행되는 것을 관찰하고있다. 특히, "Execution finished"는 인쇄되지 않습니다.

scala> val x = multiply2(4) 
Executing now 
inside multiply2 
x: Int = 8 

나는

2.11.8 내가 여기 뭔가 잘못하고 있습니까 스칼라 사용하고? 이것은 수수께끼이고 나는 약간 도움을 바랄 것입니다.

+2

은'return'가 wrapper_function''로 전달 블록에서 반환되지 않고, 그것은'에서 반환 곱하기 2 '전체로. 'return x * 2'를'x * 2'로 바꿉니다. – Alec

+0

'return'에 대한 위대한 블로그 글 : https://tpolecat.github.io/2014/05/09/return.html –

답변

6

귀하의 문제는 "반환"진술이라고 생각합니다.

스칼라에서 반환은 java에서와 동일하게 작동하지 않습니다. in this answer을 볼 수는 있지만 기본적으로 래퍼 함수에서 반환 할 수있는 "스택 해제"의 일부입니다.

f : => T를 할 때 실제로 블록을 가져 와서 실행한다고 생각하십시오. 이 블록은 단순히 랩퍼에서 분리되어 값을 리턴하는 리턴을가집니다 (리턴을 사용하지 않을 경우 결과가 지정에 사용됩니다). 당신은 함수 나 블록의 끝에서 스칼라 반환을 사용하는 경우, 당신은 거의 항상 무언가를 틀리게하고 일반적으로

, ...

0

아사 프 Mendelson은의 대답은 대부분의 경우 올바른 것입니다. 당신이 포장하거나하는 내부 함수의 코드를 소유하지 않은 경우 그러나, 내부 함수에 return을 사용하는 합법적 인 경우이

를 들어 (here 참조) 시나리오에서 작동하지 않습니다 이러한 경우, 그것은 시도 - 마지막 블록의 내부 기능을 실행함으로써 작동 : multiply2` '에서

def wrapper_function[T](f: => T): T = { 
    println("Executing now"); 
    val ret: T = try f finally { 
     println("Execution finished"); 
    } 
    ret 
}