第十章 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容器

相關文章
相關標籤/搜索