2017-09-14 24 views
0

オブジェクトを返すメソッドをラップすることができる汎用ラッパー関数を作成しようとしています。 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 
} 

しかし、私は何もラッパー関数内の関数呼び出しの後に実行されていることを観察している。具体的には、「実行終了」は印刷されません。

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

私はScalaの2.11.8

を使用しています私はここで何か間違ったことをやっていますか?これは困惑しており、私はいくつかの助けに感謝します。

+2

、それは'から戻っています乗算2を全体として計算する。 'return x * 2'を' x * 2'だけに置き換えてください。 – Alec

+0

'return'についての素晴らしいブログ記事:https://tpolecat.github.io/2014/05/09/return.html –

答えて

6

私はあなたの問題が「返品」陳述であると信じています。

scalaでの戻り値は、javaと同じには動作しません。 in this answerを見ることができますが、基本的にはラッパー関数から戻ってくる "スタック巻き戻し"のようなものです。

f:=> Tを実行すると、実際にブロックを実行して実行していることを考慮してください。このブロックには、単純にラッパーから壊れて値を返すリターンがあります(戻り値を使用しない場合は、その結果が代入に使用されます)。一般的に

あなたが関数やブロックの最後にScalaでリターンを使用している場合、あなたはほとんど常に何か間違ったことをやっている...

0

アサフメンデルソンの答えは、ほとんどの状況で正しいです。しかし、それがために(hereを参照してください)あなたがラップしている内部関数のコードを所有していない、またはは内部機能にreturnを使用するための正当なケースがある場合のシナリオで

を動作しません。そのような場合には、それは、try-finallyブロック内の内部機能を実行することで動作します: `return`はwrapper_function``に渡されたブロックから戻っていないmultiply2` `で

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