5-t*_*o-9 4 scala lazy-evaluation
我可能想要使用昂贵的方法并根据副作用返回结果.例如,取决于一天/一周的时间和量子时间动力学的蒙特卡罗模拟.因为它很贵而我可能不需要它,我会使用Scalaslazy val
lazy val maybeUnusedValue = getDayOfWeek
Run Code Online (Sandbox Code Playgroud)
现在我的程序仍在运行12个小时.我想重做计算,因为我的日子可能在此期间发生了变化.
是否有一种简单的方法可以强制Scala返回maybeUnusedValue到未初始化的状态,因此强制重新计算其下一次使用?
有一个简单的方法
由于"懒惰"是用跟踪初始化的字段实现的,因此简单的解决方案是使用可变引用来包装惰性val.当然,你必须处理该引用的可变性.
scala> class V { lazy val v = System.currentTimeMillis }
defined class V
scala> @volatile var x = new V
x: V = V@77468bd9
scala> x.v
res0: Long = 1431212391127
scala> x.v
res1: Long = 1431212391127
scala> x = new V
x: V = V@28f67ac7
scala> x.v
res2: Long = 1431212407970
Run Code Online (Sandbox Code Playgroud)
然后像
scala> import concurrent._, duration._, ExecutionContext.Implicits.global
import concurrent._
import duration._
import ExecutionContext.Implicits.global
scala> implicit class ex(val d: Deadline) extends AnyVal { def expiring(f: => Unit) =
| Future(Await.ready(Promise().future, d.timeLeft)) onComplete (_ => f) }
defined class ex
scala> 10 seconds fromNow expiring { x = new V }
scala> x.v
res4: Long = 1431212407970
scala> x.v
res5: Long = 1431212407970
scala> x.v
res6: Long = 1431213010180
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1126 次 |
| 最近记录: |