我有这样的功能:
private def add[T](n: String, t: T, k: Map[String,T]): T = { k += (n -> t); t }
编译器抱怨说有一个val重新分配,所以没有把它改成一个可变的地图,有没有办法像案例类那样说“var k:Map ...”?
谢谢!
答案 0 :(得分:8)
你要求的是一个pass by reference论点。 JVM没有这些,Scala也没有。*
您必须返回更新后的地图:
private def add[T](n: String, t: T, k: Map[String,T]): Map[String,T] = k + (n -> t)
或返回两者,或者如果必须返回T
,请编写一个包装类:
case class Vary[A](var value: A) { def apply() = value }
private def add[T](n: String, t: T, k: Vary[Map[String,T]]) = { k.value += (n -> t); t }
val map = Vary( Map.empty[String,Int] )
add("fish", 5, map)
map() //Map[String,Int] = Map(fish -> 5)
*嗯,不是直接的。当然,必须以某种方式用闭包来改变外部上下文中的变量,事实上Scala所做的就是使用一个与我上面展示的类似的包装类。