加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:59:30 所属栏目:安全 来源:网络整理
导读:我有这样的功能: private def add[T](n: String,t: T,k: Map[String,T]): T = { k += (n - t); t } 编译器抱怨说有一个val的重新分配,所以没有把它改成一个可变的地图,有没有办法像案例类那样说“var k:Map …”? 谢谢! 解决方法 你要求的是一个 pass by
我有这样的功能:

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

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

谢谢!

解决方法

你要求的是一个 pass by reference的论点. JVM没有那些,Scala也没有.*

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

private def add[T](n: 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,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所做的就是使用与上面显示的类似的包装类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读