在Scala中将函数参数定义为"var"?

Ale*_*lex 6 syntax scala

我有这样的功能:

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

编译器抱怨说有一个val的重新分配,所以没有把它改成一个可变的地图,有没有办法像案例类那样说"var k:Map ..."?

谢谢!

Rex*_*err 8

你要求的是一个参考传递参数.JVM没有那些,Scala也没有.*

您将要么返回更新的地图:

private def add[T](n: String, t: T, k: Map[String,T]): Map[String,T] = k + (n -> t)
Run Code Online (Sandbox Code Playgroud)

或者返回两者,或者如果必须返回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)
Run Code Online (Sandbox Code Playgroud)

*好吧,不是直接的.当然,必须以某种方式使用闭包来改变外部上下文中的变量,事实上Scala所做的就是使用与上面显示的类似的包装类.

  • 它不一定是参考传递.它可能是一个`var`而没有在被调用者上重新分配可见.我会告诉你它确实看起来像是希望通过引用传递,否则,代码将毫无意义.我能说什么?我很挑剔.:-) (4认同)