2

次のようなサードパーティコードの関数を使用しています。

scala> def willCallback(fun: Function1[Int, Unit]) {
     | doWork()
     | fun(1)
     | }
willCallback: (fun: Int => Unit)Unit

私のコードでは、関数を定義し、これを実現するためにコールバック関数パラメーターを返すようにします。

scala> def callbackResult():Int = {
     |   willCallback( (i:Int) => {
     |     // What do I put here 
     |     // to make the return value of callbackResult to be i?
     |   })
     | }

機能させるにはどうすればよいですか?

ありがとう。

4

4 に答える 4

4

willCallbackあなたのコメントから、コールバックが実行されるまでブロックしたいようです。Scala 2.10のFuture/Promise API を使用してそれを行う方法は次のとおりです。

import scala.concurrent._

// Library code (which you can't modify)
def willCallback(fun: Int => Unit) { fun(1) }

// Your code. You can fulfill a `promise` in your callback
def callbackResult(): Int = {
  val p = promise[Int]
  val f = p.future

  willCallback { i: Int =>
    p.success(i)
  }

  // Block until the promise has been fulfilled (the callback has executed).
  // In this case, the return value is 1
  Await.result(f, duration.Duration.Inf)
}

もちろん、コールバックが実行されない場合、callbackResult()メソッドが無期限にハングする危険があります。この危険を回避するには、Régis Jean-Gilles が示唆するように、その価値を待つよりもcallbackResult()戻る方がよいかもしれません。f: Future[Int]Int

于 2013-02-15T07:41:14.447 に答える
1

あなたが何を望んでいるのか、何を期待しているのかは本当に明確ではありませんが、return初心者にとっては混乱を招くだけでなく、お勧めすることはほとんどありません.

「コールバック」を式または式のシーケンスとして定式化してみてください。最後の式が「返したい」値である何か。

知っておく必要があるのはreturn、関数や内部メソッドではなく、トップレベルのメソッドから返されるということです。

于 2013-02-15T06:04:28.623 に答える
1

これはあなたが意味するものですか?

def callbackResult(result:Int) = {
   // code
}

willCallback(callbackResult)

別のバージョンは次のようになります。

willCallback( { result =>
   // code
})
于 2013-02-15T07:37:17.603 に答える
1

何を達成しようとしているのかは明確ではありませんが、別のショットを次に示します。

def callbackResult():Int = {
  var result = 0
  willCallback( (i:Int) => {
    result = i
    // rest of your code
  })
  result
}
于 2013-02-15T07:42:04.047 に答える