Scala Mutable Option?

时间:2014-10-20 21:48:00

标签: scala scala-collections scala-option

我想要这样的事情:

private val cachedResponse = mutable.Option.empty[A]

def get: A = cachedResponse getOrElseUpdate db.findModel()

def update: Unit = {
  db.updateModel
  cachedResponse.empty()    // set it to None/Option.empty
}

我不是在寻找基于HashMap的通用memoization like this。我尝试使用var Option[A]来实现它,但它对我来说看起来不是很惯用:

private var cachedResponse: Option[A] = None

def get: A = cachedResponse getOrElse {
 cachedResponse = Option(db.findModel())
 cachedResponse.get
}

def update: Unit = {
  db.updateModel
  cachedResponse = None
}

1 个答案:

答案 0 :(得分:5)

标准库中没有内置。

使用包含不可变var的{​​{1}}是惯用的方法(假设您无法重写此内容而根本不使用状态)。

否则,你应该建立自己的。这是实施的核心:

Option

如果使用REPL,则与class MutableOpt[A] { private[this] var myValue: A = _ private[this] var loaded = false private def valueEquals(o: Any) = myValue == o def get = if (loaded) myValue else throw new NoSuchElementException("MutableOpt") def set(a: A): this.type = { loaded = true; myValue = a; this } def getOrSet(a: => A): A = { if (!loaded) { myValue = a loaded = true } myValue } def isEmpty = !loaded def nonEmpty = loaded def foreach[U](f: A => U): Unit = if (loaded) f(myValue) def transform(f: A => A): this.type = { if (loaded) myValue = f(myValue); this } def clear(): this.type = { loaded = false; this } def toOption = if (loaded) Some(myValue) else None override def toString = if (loaded) "MutableOpt("+myValue.toString+")" else "MutableOpt()" override def hashCode = if (loaded) myValue.hashCode else 1751 override def equals(o: Any) = o match { case m: MutableOpt[_] => (isEmpty && m.isEmpty) || (nonEmpty && m.nonEmpty && m.valueEquals(myValue)) case _ => false } } object MutableOpt { def from[A](o: Option[A]) = { val m = new MutableOpt[A] o match { case Some(a) => m set a case _ => } m } } 一起定义。