7

我有这样的功能:

private def add[T](n: String, t: T, k: Map[String,T]): T = { k += (n -> t); t }

编译器抱怨对 val 进行了重新分配,因此没有将其更改为可变映射,有没有办法像在案例类中那样说“var k: Map ...”之类的东西?

谢谢!

4

1 回答 1

9

您要求的是通过引用参数传递。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)

*好吧,不是直接的。当然,必须通过闭包以某种方式更改外部上下文中的 var,实际上 Scala 所做的是使用包装类,就像我在上面展示的那样。

于 2012-06-30T19:26:21.623 回答