浏览 Map.withDefault,我无法弄清楚“get”的定义位置。尽管 default 似乎很明显没有记忆1,但似乎“get”的某些实现可以在幕后记忆。
基本上,我想知道的是,如果我有一个我只想做一次的计算,一个默认的地图会做很多次,还是只做一次?
浏览 Map.withDefault,我无法弄清楚“get”的定义位置。尽管 default 似乎很明显没有记忆1,但似乎“get”的某些实现可以在幕后记忆。
基本上,我想知道的是,如果我有一个我只想做一次的计算,一个默认的地图会做很多次,还是只做一次?
不是问题。很长一段时间以来,我一直在做一个非常相似的把戏。
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
问完这个问题后,我立即意识到我可以使用嵌入在我的函数中的 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
所以答案是:不。自己滚。