2

浏览 Map.withDefault,我无法弄清楚“get”的定义位置。尽管 default 似乎很明显没有记忆1,但似乎“get”的某些实现可以在幕后记忆。

基本上,我想知道的是,如果我有一个我只想做一次的计算,一个默认的地图会做很多次,还是只做一次?

4

2 回答 2

1

不是问题。很长一段时间以来,我一直在做一个非常相似的把戏。

scala> :paste
// Entering paste mode (ctrl-D to finish)

def someFunction ( s : String ) = {
  println("someFunction called")
  s.size
}
val someFunctionMemoized : String => Int
  = new collection.mutable.HashMap[String, Int] {
      override def default ( key : String )
        = {
          val value = someFunction(key)
          update(key, value)
          value
        }
    }

// Exiting paste mode, now interpreting.

someFunction: (s: String)Int
someFunctionMemoized: String => Int = Map()

scala> someFunctionMemoized("abc")
someFunction called
res0: Int = 3

scala> someFunctionMemoized("abc")
res1: Int = 3
于 2012-09-14T20:18:21.883 回答
1

问完这个问题后,我立即意识到我可以使用嵌入在我的函数中的 mutator 签入 repl。

scala> val map = new Map.WithDefault[String, String](Map(), {string => { println(string); string } } )
map: Map.WithDefault[String,String] = Map()

scala> map("key")
key
res5: String = key

scala> map("key")
key
res6: String = key

scala> import scala.collection.mutable
import scala.collection.mutable

scala> val mmap = new mutable.Map.WithDefault[String, String](mutable.Map(), {string => { println(string); string } } )
mmap: scala.collection.mutable.Map.WithDefault[String,String] = Map()

scala> mmap("key")
key
res7: String = key

scala> mmap("key")
key
res8: String = key

所以答案是:不。自己滚。

于 2012-09-14T17:57:07.997 回答