第十章 Scala 容器基础(六):理解定义一个变量指向一个不可变集合

本文通过实例解析Scala中不可变容器的工作原理。解释了如何使用:+操作符看似改变不可变容器Vector的内容,实则是创建并指向新容器的过程。并通过尝试修改不可变容器中的元素进一步验证其不可变性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

    正像标题所说的,我们定义一个变量来指向一个不可变容器会引起一个让其奇怪的现象,你会发现你可用用某种方式来给它添加一个新的元素。

scala> var sisters = Vector("Melinda")
sisters: scala.collection.immutable.Vector[String] = Vector(Melinda)

scala> sisters = sisters :+ "Melissa"
sisters: scala.collection.immutable.Vector[String] = Vector(Melinda, Melissa)

scala> sisters = sisters :+ "Marissa"
sisters: scala.collection.immutable.Vector[String] = Vector(Melinda, Melissa, Marissa)

这发生了什么?我们居然改变了一个不可变容器的内容吗?

解决:

    我们居然改变了一个不可变容器的内容,可是这肯定不是真的。那么真相到底是什么呢,其实是每次调用:+方法的时候,都会返回一个新的Vector,那么我们的sisters变量每次都指向了新的Vector。实际上这个结果更近似于下面的代码:

scala> var sisters = Vector("Melinda")
sisters: scala.collection.immutable.Vector[String] = Vector(Melinda)

scala> sisters = Vector("Melinda", "Melissa")
sisters: scala.collection.immutable.Vector[String] = Vector(Melinda, Melissa)

scala> sisters = Vector("Melinda", "Melissa", "Marisa")
sisters: scala.collection.immutable.Vector[String] = Vector(Melinda, Melissa, Marisa)

    第二行和第三行语句实际上是改变了变量Sisters引用,指向了一个新的集合。你可以尝试改变不可变容器的内容,你会发现,这是不可能的:

scala> sisters[3] = "Marry"
<console>:1: error: identifier expected but integer literal found.
       sisters[3] = "Marry"
               ^
总结:

    刚刚接触Scala的同学,可能会对这种变量指向一个不可变容器产生疑惑,为了让大家弄清楚我们来看下变量:

  • 一个可变变量(var),可以指向一个新的数据

  • 一个不可变变量(val),java中final定义的变量,不可以指向一个新的数据

    再来看下容器:

  • 一个可变容器的元素是可以改变的,比如ArrayBuffer

  • 一个不可变容器的元素是不可以改变的,比如Vecrot










转载于:https://my.oschina.net/nenusoul/blog/656176

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值