2017-09-14 118 views
0

我想創建一個通用的包裝函數,可以圍繞返回對象的任何方法。 SO問題非常類似於this中的答案。我試過以下內容:Scala:返回泛型類型的包裝函數

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 
} 

但是,我觀察到在wrapper函數內函數調用後沒有任何東西正在執行。具體而言,「執行完成」未被打印。

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

我使用Scala的2.11.8

難道我做錯了什麼嗎?這令人費解,我希望得到一些幫助。

+2

在'multiply2'中,'return'不從傳遞給'wrapper_function'塊返回時,它被阻止返回'作爲一個整體乘以2。用'x * 2'替換'return x * 2'。 – Alec

+0

關於'return'的博客文章:https://tpolecat.github.io/2014/05/09/return.html –

回答

6

我相信你的問題是「返回」聲明。

scala中的返回值與java中不一樣。你可以看看in this answer,但基本上它是一個「堆棧展開」,它會導致你從包裝函數返回。

想一想,當你做f:=> T時,你實際上是在拿着這個塊並運行它。這個塊有一個返回值,它只是從包裝中斷開並返回值(而不是使用返回值,在這種情況下,它的結果將用於賦值)。

在一般情況下,如果你使用Scala的回報在功能或塊的末尾,你幾乎總是做錯了什麼......

0

阿薩夫門德爾鬆的答案是在大多數情況下是正確的。但是,它不工作的情況下,你不承認你是包裝,或內部函數的代碼時有在內部功能使用return一個合法的情況下(見here

對於這種情況下,它會通過在一個try-finally塊執行內部函數工作:

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