2014-10-20 73 views
3

我想是這樣的:Scala Mutable Option?

​​

我不是在尋找一個通用的HashMap基於記憶化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 
} 
+3

一個快速的谷歌搜索發現這個實現,看起來像你想要的...:http://blog.adamdklein.com/?p=689 – experquisite 2014-10-20 21:59:09

回答

4

沒有一個內置的標準庫。

使用包含一個不可變的Optionvar是這樣做的慣用方法(假設您不能重寫它以根本不使用狀態)。

否則,你應該建立自己的。下面是一個實現的核心:

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與:paste一起定義。

+0

LGTM。感謝分享。但是,在多線程環境中getrSet中可能存在一些競爭條件。 – pathikrit 2014-10-21 03:19:47

+0

沒錯,這正是不可變性與可變性之間的優勢之一。 – 2014-10-21 04:46:22

+0

@wrick - 絕對,就像幾乎所有的東西都是可變的。你可以使所有的操作都是原子的,但是性能會受到影響。 – 2014-10-21 08:48:18

相關問題