Scala Mutable Option?
发布时间:2020-12-16 18:16:39 所属栏目:安全 来源:网络整理
导读:我想要这样的东西: 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} 我不是在寻找一个基
我想要这样的东西:
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 } 解决方法
标准库中没有内置的.
使用包含不可变选项的var是执行它的惯用方法(假设您不能将其重写为根本不使用状态). 否则,你应该建立自己的.这是实现的核心: 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 } } 与以下内容一起定义:如果使用REPL则粘贴. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |