4

次のコードスニペットについて考えてみます。

class MyClass {
  var a = _
  var b = _
  ...
  var y = _

  val z = (for {
    a0 <- someMethodReturningFuture
    b0 <- someMethodReturningFuture(a0)
    ...
    z0 <- someMethodReturningFuture(y0)
  } yield {
    a = a0
    b = b0
    ...
    y = y0
    someCalculation(y)
  }).result
}

そのような初期化を実行することは可能ですが、(どういうわけか)svalの代わりにsを使用しますか?var重要なのは、すべての中間結果をブロックして待つのではなく、最後の結果だけを待つということです。

4

2 に答える 2

6

22を超える変数がない限り、次のようになります。

val (a, b, c, d, ..., v) = (for {
  a0 <- someMethodReturningFuture
  b0 <- someMethodReturningFuture(a0)
  ...
  u0 <- someMethodReturningFuture(t0)
} yield {
  (a0, b0, ..., u0, someCalculation(u0))
}).result
于 2012-07-16T08:46:06.073 に答える
3

result値を使って評価を遅らせてもらえlazyますか?何かのようなもの:

class MyClass {

  lazy val a = myFutures.a.result
  lazy val b = myFutures.b.result

  private val myFutures = new AnyRef {
    val a = someMethodReturningFuture
    val b = a.map( a0 => someMethodReturningFuture(a0) )
  }

}

すべての先物はブロックせずに初期化時に作成されますが、実際に結果を使用しようとするときに最初にブロックします。

于 2012-07-16T11:11:52.197 に答える