1. 程式人生 > >scala可變var與不可變val的理解

scala可變var與不可變val的理解

我們定義變數的時候分為var可變變數和val不可變變數。

我們使用容器的時候也分為可變容器和不可變容器。

List和Tuple本身就是不可變的,set和map分為可變和不可變的,預設為不可變。

我們看這樣一個例子

1 2 var list = List(“Hello”,“World”); list += “Scala”;

這樣的一段程式碼怎麼理解呢?var是可變的啊,List是不可變的,怎麼能結合使用呢?List為啥還能新增元素呢?

首先,我們理解為啥List不可變還能新增元素。

我們原本的list是不可變的,這樣沒錯。

我們在執行新增“Scala”時並不是在原本的List物件新增,而是新建一個List包含了Hello,World,Scala。

那麼,var是可變的,List不可變,能結合使用有問題嗎?

當然沒有問題,我們定義變數所使用的是var和val指的是“指標”,他們和物件可不可變並沒有任何關係。

如同例子來說,var list指向的物件是List(“Hello”,“World”),

我們可以修改list的指向,因為是var,所以後邊list又可以指向新的List(“Hello”,“World”,“Scala”)。

如果我們定義把var list換成val list還能執行+=新增元素嗎?結果是不能的。

理解完這些,我們來看下Set和Map。

這個例子和上面list例子一樣理解。

1 2 var mySet = Set( "Hello"
, "World" ); //不可變的Set包名為 scala.collection.numutable.Set mySet +=  "Scala" ;

注意,我們這裡並沒有匯入任何包,Set預設是不可變的。

我們定義一個可變的Set和一個不可變的指標。

1 2 3 import  scala.collection.mutable.Set val mySet = Set( "Hello" , "World" ); mySet +=  "Scala" ;

這樣的一個例子我們怎麼理解呢?

首先,我們在之前的例子中瞭解到

不可變的Set在新增元素的時候,原來的Set不變,生成一個新的Set來儲存原來的Set+新增的元素;

當然可變的Set在新增元素的時候,並不用新生成一個Set,而是直接將元素新增到原來的Set中。

那麼我們定義val不可變這樣可以嗎?

當然可以,因為你定義val不可變的只是指標,跟物件沒有任何的關係,

只不過mySet指標不能修改,跟物件本身是否能修改沒有任何關係。

Map同理。