2

私はScala.Reactと問題に関する更新された論文をSignal調べて、単純なベースの例を機能させようとしています。

Signalこの論文のメソッドはそのままでは存在しないことを理解していますが、代わりに と がStrictありLazyます。だから私の素朴な最初の試み:

全体の設定:

object dom extends scala.react.Domain {
  val engine    = new Engine
  val scheduler = new ManualScheduler
}
import dom._

構成を試す:

val v1, v2 = Var(0)

val f = Strict { v1() + v2() }

2行目はクラッシュします

java.lang.AssertionError: assertion failed: This method must be run on its domain
  scala.react.NilDebug@4eaf6cb1
    at scala.Predef$.assert(Predef.scala:179)
    at scala.react.Debug.assertInTurn(Debug.scala:37)
    at scala.react.EngineModule$Propagator.defer(EngineModule.scala:120)
        ...

だから私は何か間違ったことをしているに違いない。しかし、何?


2 回目の試行:

scala> dom.start()

scala> var v1, v2, f = (null: Signal[Int])
v1: dom.Signal[Int] = null
v2: dom.Signal[Int] = null
f: dom.Signal[Int] = null

scala> schedule { v1 = Var(0); v2 = Var(0) }

scala> schedule { f = Strict { v1() + v2() }}

scala> engine.runTurn()

scala> schedule { println(f.now) }

scala> engine.runTurn()
Uncaught exception in turn!
scala.react.EngineModule$LevelMismatch$
4

1 に答える 1

1

わかりましたので、スケジュールされたターン内に実行する必要があるため、これらの信号への参照を保持したい場合は、Lazy代わりに使用する必要があります。StrictStrict

以下は私の新しい試みです。これが意図されているかどうかはわかりませんが、動作します:

object Test extends scala.react.Domain with App {
  val engine    = new Engine
  val scheduler = new ManualScheduler

  val v2   = Var(0)
  val v1   = Lazy { v2() + 10 }
  val f    = Lazy { v1() + v2() }

  start()

  schedule {
    new Observing {
      observe(f) { p =>
        println(s"Observed: $p")
      }
    }
    v2() = 5
  }

  runTurn()
}
于 2013-06-20T16:21:23.880 に答える