【问题标题】:Define a function parameter as a "var" in Scala?在Scala中将函数参数定义为“var”?
【发布时间】:2012-06-30 19:12:12
【问题描述】:

我有这样的功能:

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

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

谢谢!

【问题讨论】:

    标签: scala syntax


    【解决方案1】:

    您要求的是 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)
    

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

    【讨论】:

    • 它不必是通过引用传递。它可能是var,而不会在被调用者上显示重新分配。我承认他确实希望通过引用传递,否则代码将毫无意义。我能说什么?我很挑剔。 :-)
    • @DanielC.Sobral - 我的后编译例程的优化步骤将该分支消除为死代码,因此我没有提及它。 :)
    猜你喜欢
    • 1970-01-01
    • 2013-03-21
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多