我最近学习了scala,但在修改地图值时发现了一个问题。
def exercise1():Map[String, Int]={
val map = createMap()
var newMap = map
for((k,v) <- map){
newMap(k) = 2 * v;
}
newMap
}
函数exercise1可以运行。但是当我改变下一行
时newMap(k) = v * 2;
我发现它失败了,为什么?
答案 0 :(得分:2)
我不确定createMap()
函数返回什么,但我的猜测是它返回Map[String, Int]
。
如果这是真的,那么您的代码将失败,因为Map[String, Int]
是不可变的,并且您无法使用此代码newMap(k) = 2 * v
将值重新分配给不可变映射。您必须在此处使用mutable.Map[String, Int]
。
示例代码(在scala REPL中):
scala> val x = Map("foo" -> 1, "bar" -> 2)
x: scala.collection.immutable.Map[String,Int] = Map(foo -> 1, bar -> 2)
scala> var y: scala.collection.mutable.Map[String, Int] = scala.collection.mutable.Map(x.toSeq: _*)
y: scala.collection.mutable.Map[String,Int] = Map(foo -> 1, bar -> 2)
scala> y("foo") = 3
scala> y
res2: scala.collection.mutable.Map[String,Int] = Map(foo -> 3, bar -> 2)
但是,你需要的只是一张新地图,所有值都加倍,你可以这样做:
x.map { case (k, v) => k -> 2 * v }