2015-01-13 7 views
5
/** When this future is completed, either through an exception, or a value, 
    * apply the provided function. 
    * 
    * If the future has already been completed, 
    * this will either be applied immediately or be scheduled asynchronously. 
    * 
    * $multipleCallbacks 
    * $callbackInContext 
    */ 
    def onComplete[U](func: Try[T] => U)(implicit executor: ExecutionContext): Unit 

を理解することはできません基本的な使用法はあると思われる:Future.onComplete:メソッドのシグネチャに

result.onComplete({ 
    case Success(listInt) => { 
     //Do something with my list 
    } 
    case Failure(exception) => { 
     //Do something with my error 
    } 
    }) 

この機能は、それが(ログ完了など)ユニットを返すなどの副作用を生じさせるのに便利なようだ 何が理解できないのは、このタイプの関数Uが返すものです。私たちが提供する関数の戻り値の型は本当に便利ですか? Scalaはどのように使用していますか?

同じ質問がonSuccessonFailure

編集に適用できる:それをより明確にするためにdef onComplete[U](func: Try[T] => U)def onComplete(func: Try[T] => Unit)以上のメリットは何ですか?


編集

Chirloは右である、タイプUの関数はより柔軟であり、我々はより簡単にユニットを返さない既存の関数を渡すことができます。

type T = String 

def onComplete[U](func: Try[T] => U): Unit = { } 
def onComplete2(func: Try[T] => Unit): Unit = { } 

// Existing function that does not return Unit 
def log[T](t : Try[T]): Int = 0 

onComplete(log) // This compiles fine 
onComplete2(log) // This does not compile 
+0

[http://docs.scala-lang.org/overviews/core/futures.html]先物と約束のための最良の場所 – GKV

+0

はい@GKV私は 'Callbacks'セクションを一見しました。 'U'型の使用法が記述されていないように思われたので、私はそれほど助けになりませんでした。 –

+0

あなたはすでに関数' val op:Try [Int] => Sting'を持っているとしましょう。 '[U]'でこれを 'onComplete(op)'のように使うことができます。 '[U]'がなければ、このようにしなければなりません: 'onComplete(op(_))'(追加の無名関数)。 – senia

答えて

1

これは機能をより柔軟にします。 Unitを返す場合は、関数Try[T] => Unitを渡すだけで済みますが、Uを返すことで、Try[T]が既に存在している可能性のある関数に渡すことができます。例:

def log[T](t : Try[T]): Int = //write to file and return 0 if Ok, else 128 

この関数には副作用がありますが、値も返されます。Futureにこの関数を渡すことはできますが、Unitが返されず、結果は破棄されますが、既存の関数を再利用することができます。

+0

はい、あなたは書いています、私は私自身の質問でいくつかのexplaiinationsを与えました –

-1

非常に単純な例では、クラウド

val a = Future(1/2) 
a.onComplete[String]({ 
    case Success(1) => "StringValue"   
}) 

をクリアする必要があり、ここでUは、文字列とTが成功のintです。

今例のスカラ座のほとんどは、データ型であり、我々は我々が何かに文字列「STRINGVALUE」を変更した場合、特にUとT

上記の例では、エラーになりますタイプを言及しないように必要なものを理解して他

val a = Future(1/2) 
a.onComplete[String]({ 
    case Success(1) => 1 
}) 

コンパイルエラー - 型の不一致。見つかった:Intが(1)必要:文字列

しかし、我々は完全に文字列を削除し、文字列として戻り値の型を強制していない場合、それは任意の型を取る

val a=Future(1/2) 
a.onComplete({ 
    case Success(1)=>1 
    case Success(2) => "we found two" 
    case Success(3) => 1.0f 
    case Success(_) => new RuntimeException("it was not expected") 
}) 

は罰金コンパイルします。となり、ユースケースに応じて複数のタイプを返す力が得られます

+0

私はあなたのポイントを理解するのか分かりません。私はこのコンパイルエラーが何であるか知っているだけで、ちょうど副作用を生み出す関数でコンパイルルールを強制する点を理解していない。 –

+0

私は最後に編集した。これが助けてくれることを願っています。 出力タイプを制限したい場合に役立ち、省略した場合、あなたのケースに該当するものを出力することができます。 これが助けてくれることを願っています! – GKV

+0

Sebastienのように、私はこの答えのポイントを本当に理解していません。 'a.onComplete [Any]'もあなたの例の下でうまくコンパイルされます。 –

関連する問題