scala - Lazy Val - 如何重置值?

标签 scala lazy-evaluation

我可能想使用一种昂贵的方法,并根据副作用返回结果。例如,取决于一天/一周的时间和量子时间动力学的蒙特卡罗模拟。因为它很贵而且我可能不需要它,所以我将使用 Scalas lazy val

lazy val maybeUnusedValue = getDayOfWeek

现在 12 个小时过去了,我的程序仍在运行。我想重新计算,因为我的一天可能在此期间发生了变化。

有没有一种简单的方法可以强制 Scala 返回 maybeUnusedValue回到未初始化状态,因此强制重新计算其下一次使用?

最佳答案

Is there a simple way



由于“懒惰”是通过一个字段来实现的,以跟踪初始化,简单的解决方案是用可变引用包装惰性 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

然后像
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

关于scala - Lazy Val - 如何重置值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30144692/

相关文章:

json - Spark 如何在 Scala 的两个 JSONS 中更改键的数量?

python - Spark k-means OutOfMemoryError 异常

scala - Scala 2.10中如何实现惰性val类变量?

haskell - 如何在haskell中高效地实现迭代深化搜索?

haskell - "strict returns"的语义是什么?

c++ - C++ 中的良好实践(惰性评估)

javascript - 在 scala.js 中使用 chart.js - 未捕获的类型错误未定义不是函数

scala - Scala 2.9 之后将删除哪些包/类/方法/功能?

Scala 将 map 列表转换为 map

functional-programming - 惰性序列中 "Lose your head"的解释