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

问题:

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

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)

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

解决:

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

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引用,指向了一个新的集合。你能够尝试改变不可变容器的内容,你会发现,这是不可能的:code

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

总结:

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

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

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

    再来看下容器:
table

  • 一个可变容器的元素是能够改变的,好比ArrayBufferclass

  • 一个不可变容器的元素是不能够改变的,好比Vecrot容器

相关文章
相关标签/搜索